设计模式理解:工厂模式,抽象工厂,原型方法
生活随笔
收集整理的這篇文章主要介紹了
设计模式理解:工厂模式,抽象工厂,原型方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ?工廠模式、抽象工廠、原型方法都是對象創建型模式。工廠模式的目的是利用抽象類去動態地創建對象;抽象工廠模式是利用抽象類動態地創建一系列的對象;而原型方法是通過克隆(深拷貝)地形式創建出對象 ,再去操作新創建的對象,而不去修改原型內容。
工廠方法,將要創建的對象內容該由外部參數決定,而內部程序不需要考慮具體初始化哪個實體對象。例如如果要擴展Oracle的連接實體類,只需要再擴展DBFactory即可。當然,如果把createConnection設置成虛函數,那么就可以對IconnectionFactory進行擴展,例如還可以創建網絡連接工廠類等。
enum ConnectId {SQLSEVER,ORACLE,MYSQL} class IconnectionFactory{ public:virtual Iconnection * createConnection(ConnectId ) = 0; } class DBFactory:public IconnectionFactory{ public:virtual Iconnection * createConnection(ConnectId id){switch(id){case SQLSEVER:return new SQLSeverConnection();case MYSQL:return new MYSQLConnection();.....}}; } class Iconnection{ }class SQLSeverConnection:public Iconnection{ } class MYSQLConnection:public Iconnection{ } ///------當實體類擴展時主函數可以保持不變--------void Process(ConnectId cid ){DBFactorydbfactory;Iconnection* iconnect = dbfactory.createConnection(cid); }而抽象工廠方法是為了創建一系列的對象,這一系列的對象有一定的關聯性,抽象工廠做法就是把各自的工廠封裝在同一個種。例如 SQLCommand 可 SQLConnection 數據庫類型必須要保持一致。
enum ConnectId {SQLSEVER,ORACLE,MYSQL} class DBFactory{ public:virtual Iconnection * createConnection(ConnectId id){switch(id){case SQLSEVER:return new SQLSeverConnection();case MYSQL:return new MYSQLConnection();.....}}virtual ICommand* createICommand(ConnectId id){switch(id){case SQLSEVER:return new SQLSeverCommand();case MYSQL:return new MYSQLCommand();.....}} }class Iconnection{ } class ICommand{ }class SQLSeverConnection:public Iconnection{ } class MYSQLConnection:public Iconnection{ } class SQLSeverCommand:public ICommand{ } class MYSQLCommand:public ICommand{ } ///------當實體類擴展時主函數可以保持不變--------void Process(ConnectId cid ){DBFactory dbfactory;Iconnection* iconnect = dbfactory.createConnection(cid);ICommand* icommand = dbfactory.createICommand(cid) }原型模式:通過深拷貝克隆出一個新的對象,將要創建的對象類型交給外部參數處理。通常還需要實現拷貝構造函數。
class ISplitter{ public:virtual void split() = 0;virtual ISplitter * clone()=0;virtual ~ISplitter(){} }class FileSplitter : ISplitter(){virtual void split(){ ...}ISplitter * clone() { return new FileSplitter (*this);} } class HTMLSplitter : ISplitter(){virtual void split(){ ...}ISplitter * clone() { return new HTMLSplitter (*this);} } //---------------void Process(ISplitter prototype){ISplitter * splitter = prototype->clone();..... }?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的设计模式理解:工厂模式,抽象工厂,原型方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式的理解:桥模式 Bridge
- 下一篇: 设计模式的理解:构造器模式(Builde