浅谈C++设计模式之工厂方法(Factory Method)
為什么要用設計模式?根本原因是為了代碼復用,增加可維護性。
面向對象設計堅持的原則:開閉原則(Open Closed Principle,OCP)、里氏代換原則(Liskov Substitution Principle,LSP)、依賴倒轉原則(Dependency Inversion Principle,DIP)、接口隔離原則(Interface Segregation Principle,ISP)、合成/聚合復用原則(Composite/Aggregate Reuse Principle,CARP)、最小知識原則(Principle of Least Knowledge,PLK,也叫迪米特法則)
- 開閉原則:模塊應該對擴展開放,而對修改關閉。也就是說,在不修改原來的代碼的前提下進行擴展。
- 里氏代換原則:如果調用的是父類的話,那么換成子類也完全沒有問題。
- 依賴倒轉原則:盡量針對接口編程,而不是針對實現編程。通過抽象父類的指針來調用子類的實現。
- 接口隔離原則:每個接口應該只有一種角色,多個角色應該用多個接口來實現。
- 合成/聚合復用:在新的對象中盡量使用已有的對象,使新對象向這些對象委派來達到復用已有功能的目的,而不是通過繼承來實現。
- 最少知識原則:一個對象應對其它對象有盡可能少的了解。
上述的這些原則也正是體現了OOP高內聚、低耦合的基本原則,最終目的都是為了代碼復用,增加可維護性。設計模式就是本著這些原則來進行OOP設計的一些方法。
設計模式開篇先來介紹工廠方法(Factory Method)模式
對象創建型模式的一種。工廠方法是定義一個用于創建對象的接口,讓子類決定實例化哪一個類,讓一個類的實例化延遲到它的子類中。
- 客戶Client
- 工廠接口Creator
- 工廠實現類ConcreteCreatorP1和ConcreteCreatorP2
- 產品接口Product
- 產品實現類ConcreteProductP1和ConcreteProductP2
上面是工廠方法模式的類圖。
首先我們有兩個產品ProductP1和ProductP2,我們現在要生產這兩個產品,這兩個產品特征如下:
(1) start(); 啟動
(2) execute(); 運行
(3) quit(); 退出
只是啟動過程不同,運行過程不同,退出也不同。
那么工廠方法模式是如何實現得到這兩個產品的對象的呢??通過上面的類圖其實我們就可以大概知道了,工廠方法大致實現過程。有幾個產品,就對應著有幾個工廠,每個工廠負責生產對應的產品。所有工廠都實現了同一個工廠接口Creator。而所有的產品也都實現了同一個產品的接口Product。
- Product(定義工廠方法所創建的對象的接口,也就是產品的接口)
- class Product{Product(){};~Product(){};virtual void start()=0;virtual void execute()=0;virtual void quit()=0; };
- ConcreteProduct(實現Product接口,也就是每個產品具體的實現方法,這里有兩個產品ConcreteProductP1和ConcreteProductP2)
- /**************************產品1*******************************/
class ConcreteProductP1:public Product{ConcreteProductP1(){};~ConcreteProductP1(){};void start();void execute();void quit(); }; ConcreteProductP1::start(){cout<<"<<----------P1 啟動---------->>"<<endl; } ConcreteProductP1::execute(){cout<<"<<----------P1 執行---------->>"<<endl; } ConcreteProductP1::quit(){cout<<"<<----------P1 退出---------->>"<<endl; } /*************************產品2********************************/ class ConcreteProductP2:public Product{ConcreteProductP2(){};~ConcreteProductP2(){};void start();void execute();void quit(); }; ConcreteProductP2::start(){cout<<"<<----------P2 啟動---------->>"<<endl; } ConcreteProductP2::execute(){cout<<"<<----------P2 執行---------->>"<<endl; } ConcreteProductP2::quit(){cout<<"<<----------P2 退出---------->>"<<endl; }
- /**************************產品1*******************************/
-
Creator(聲明工廠方法,該方法返回一個Product類型的對象;Creator也可以定義一個工廠方法的缺省實現,它返回一個缺省的ConcreteProduct對象,可以調用工廠方法以創建一個Product對象)
class Creator{ public:Creator(){};~Creator(){};virtual Product* createProduct()=0; };?
- ConcreteCreator(重定義工廠方法以返回一個ConcreteProduct實例,這里有兩個工廠實現類,各自對應上面的兩個產品)
- /*************************工廠1生成產品1**************************/ class ConcreteCreatorP1:public Creator{ public:ConcreteCreatorP1(){};~ConcreteCreatorP1(){};Product* createProduct(); }; Product* ConcreteCreatorP1::createProduct(){return new ConcreteProductP1(); }/*************************工廠2生成產品2**************************/ class ConcreteCreatorP2:public Creator{ public:ConcreteCreatorP2(){};~ConcreteCreator()P2{};Product* createProduct(); }; Product* ConcreteCreatorP2::createProduct(){return new ConcreteProductP2(); }
- Client (這里使用的是main函數)
- int main(){Creator *factory = new ConcreteCreatorP1();Product *p1 = factory.createProduct();p1.start(); //p1是這樣啟動的p1.execute(); //p1是這樣運行的p1.quit(); //p1是這樣結束的 Creator *factory = new ConcreteCreatorP2();Product *p2 = factory.createProduct();p2.start(); //p2是這樣啟動的p2.execute(); //p2是這樣運行的p2.quit(); //p2是這樣結束的return 0; }
工廠方法很簡單,經常作為一種標準的創建對象的方法。但是缺點就是可能僅僅是為了改變產品類,就可能需要創建一個新的類,也就是說當被實例化的類根本不發生變化或當實例化出現在子類可以很容易重定義的操作中,重新創建一個工廠類就顯得太浪費了。
版權所有,歡迎轉載,轉載請注明出處。
轉載于:https://www.cnblogs.com/whc-uestc/p/4750948.html
總結
以上是生活随笔為你收集整理的浅谈C++设计模式之工厂方法(Factory Method)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用户指南接口
- 下一篇: [LeetCode][JavaScrip