對象創(chuàng)建模式
- 通過對象創(chuàng)建模式繞開NEW弄屡,來避免對象創(chuàng)建(new)過程中所導致的緊耦合(依賴具體類)题禀,從而支持對象創(chuàng)建的穩(wěn)定。它是接口抽象之后的第一步工作膀捷。
工廠模式
- 為了提高內(nèi)聚和松耦合迈嘹,我們經(jīng)常會抽象出一些類的公共接口以形成抽象基類或者接口。這樣我們可以通過聲明一個指向基類的指針來指向?qū)嶋H的子類實現(xiàn)全庸,達到了多態(tài)的目的秀仲。
- 很容易出現(xiàn)一個問題N多的子類繼承自父類抽象基類,我們不得不在每次要用到子類的地方就編寫諸如new的代碼
- 工廠模式兩個重要功能:1)定義創(chuàng)建對象的接口 2)使得具體化類的工作延遲到了子類中
class ISplitter{
public:
virtual void split()=0;
virtual ~ISplitter(){}
};
//宸ュ巶鍩虹被
class SplitterFactory{
public:
virtual ISplitter* CreateSplitter()=0;
virtual ~SplitterFactory(){}
};
class BinarySplitter : public ISplitter{
};
class TxtSplitter: public ISplitter{
};
class PictureSplitter: public ISplitter{
};
class VideoSplitter: public ISplitter{
};
//具體工廠
class BinarySplitterFactory: public SplitterFactory{
public:
virtual ISplitter* CreateSplitter(){
return new BinarySplitter();
}
};
class TxtSplitterFactory: public SplitterFactory{
public:
virtual ISplitter* CreateSplitter(){
return new TxtSplitter();
}
};
class PictureSplitterFactory: public SplitterFactory{
public:
virtual ISplitter* CreateSplitter(){
return new PictureSplitter();
}
};
class VideoSplitterFactory: public SplitterFactory{
public:
virtual ISplitter* CreateSplitter(){
return new VideoSplitter();
}
};
class MainForm : public Form
{
SplitterFactory* factory;//工廠
public:
MainForm(SplitterFactory* factory){ //利用傳入?yún)?shù)來決定用什么文件分割器壶笼,這就把"變化"的范圍限制在MainForm之外了
this->factory=factory;
}
void Button1_Click(){
ISplitter * splitter=
factory->CreateSplitter(); //創(chuàng)造性的做出了一個多態(tài)的new
splitter->split();
}
};
- Factory 模式在實際開發(fā)中應(yīng)用非常廣泛神僵,面向?qū)ο蟮南到y(tǒng)經(jīng)常面臨著對象創(chuàng)建問題:要創(chuàng)建的類實在是太多了。而 Factory 提供的創(chuàng)建對象的接口封裝(第一個功能)覆劈, 以及其將類的實例化推遲到子類(第二個功能) 都部分地解決了實際問題保礼。 一個簡單的例子就是筆者開開發(fā) VisualCMCS 系統(tǒng)的語義分析過程中沛励, 由于要為文法中的每個非終結(jié)符構(gòu)造一個類處理,因此這個過程中對象的創(chuàng)建非常多炮障,采用 Factory 模式后系統(tǒng)可讀性性和維護都變得elegant 許多
抽象模式
- AbstractFactory 模式就是用來解決這類問題的:要創(chuàng)建一組相關(guān)或者相互依賴的對象目派。
- AbstractFactory 模式關(guān)鍵就是將這一組對象的創(chuàng)建封裝到一個用于創(chuàng)建對象的類( ConcreteFactory)中, 維護這樣一個創(chuàng)建類總比維護 n 多相關(guān)對象的創(chuàng)建過程要簡單的多胁赢。
//數(shù)據(jù)庫訪問有關(guān)的基類址貌。面向接口編程
class IDBConnection{
};
class IDBConnectionFactory{
public:
virtual IDBConnection* CreateDBConnection()=0;
};
class IDBCommand{
};
class IDBCommandFactory{
public:
virtual IDBCommand* CreateDBCommand()=0;
};
class IDataReader{
};
class IDataReaderFactory{
public:
virtual IDataReader* CreateDataReader()=0;
};
//支持SQL Server
class SqlConnection: public IDBConnection{
};
class SqlConnectionFactory:public IDBConnectionFactory{
};
class SqlCommand: public IDBCommand{
};
class SqlCommandFactory:public IDBCommandFactory{
};
class SqlDataReader: public IDataReader{
};
class SqlDataReaderFactory:public IDataReaderFactory{
};
//支持Oracle
class OracleConnection: public IDBConnection{
};
class OracleCommand: public IDBCommand{
};
class OracleDataReader: public IDataReader{
};
class EmployeeDAO{
IDBConnectionFactory* dbConnectionFactory;
IDBCommandFactory* dbCommandFactory;
IDataReaderFactory* dataReaderFactory;
public:
vector<EmployeeDO> GetEmployees(){
IDBConnection* connection =
dbConnectionFactory->CreateDBConnection();
connection->ConnectionString("...");
IDBCommand* command =
dbCommandFactory->CreateDBCommand();
command->CommandText("...");
command->SetConnection(connection); //關(guān)聯(lián)性
IDBDataReader* reader = command->ExecuteReader(); //關(guān)聯(lián)性
while (reader->Read()){
}
}
};
- AbstractFactory 模式是為創(chuàng)建一組( 有多類) 相關(guān)或依賴的對象提供創(chuàng)建接口, 而 Factory 模式正如我在相應(yīng)的文檔中分析的是為一類對象提供創(chuàng)建接口或延遲對象的創(chuàng)建到子類中實現(xiàn)
- AbstractFactory 模式通常都是使用 Factory 模式實現(xiàn)
接口隔離模式
原型模式
- 工廠模式 和原型模式解決的問題都是一樣的徘键,繞開new。不同點:原型模式解決更復雜的中間方法遍蟋,工廠模式解決幾步就可以解決的問題
使用一個原型實例指定創(chuàng)建對象的種類吹害,通過復制這個原型創(chuàng)建對象。
-
仍然考慮文件分割器虚青,我們類比工廠方法它呀。原型模式是一種特殊的創(chuàng)建,通過克掳衾濉(復制構(gòu)造)來進行創(chuàng)建纵穿。
class MainForm : public Form { ISplitter* prototype;// public: MainForm(ISplitter* prototype){ this->prototype=prototype; //讓原型對象指向傳過來的原型 } void Button1_Click(){ ISplitter * splitter= prototype->clone(); //克隆原型 splitter->split(); } };
建構(gòu)器
(不常用)
- 將一個復雜對象的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示
門面模式
- 為子系統(tǒng)的一組接口提供一個一致的界面奢人,門面模式定義了一個高層接口谓媒,這個接口使得這一子系統(tǒng)更加容易使用(復用)
代理模式
- 為其他對象提供一種代理以控制對這個對象的訪問
class ISubject{
public:
virtual void process();
};
//Proxy的設(shè)計
class SubjectProxy: public ISubject{
public:
virtual void process(){
//對RealSubject的一種間接訪問,可以添加一些操作
//....
}
};
class ClientApp{
ISubject* subject;
public:
ClientApp(){
subject=new SubjectProxy();
}
void DoTask(){
//...
subject->process();
//....
}
};
適配器
- 將一個類的接口轉(zhuǎn)換成客戶希望的另一個接口何乎。使原本不兼容的可以一起工作
//目標接口(新接口)
class ITarget{
public:
virtual void process()=0;
};
//遺留接口(老接口)
class IAdaptee{
public:
virtual void foo(int data)=0;
virtual int bar()=0;
};
//遺留類型
class OldClass: public IAdaptee{
//....
};
//對象適配器
class Adapter: public ITarget{ //繼承
protected:
IAdaptee* pAdaptee;//組合
public:
Adapter(IAdaptee* pAdaptee){
this->pAdaptee=pAdaptee;
}
virtual void process(){
int data=pAdaptee->bar();
pAdaptee->foo(data);
}
};
//類適配器
class Adapter: public ITarget,
protected OldClass{ //多繼承
}
int main(){
IAdaptee* pAdaptee=new OldClass();
ITarget* pTarget=new Adapter(pAdaptee);
pTarget->process();
}
class stack{
deqeue container;
};
class queue{
deqeue container;
};
中介者
- 用一個中介對象來封裝一系列的對象交互句惯。中介者使各對象不需要顯式的相互引用,從而使其耦合松散支救,而且可以獨立改變他們之間的交互