1.模式起因
在瞭解工廠方法模式前不得不提的就是簡單工廠模式,簡單工廠模式就是建造了一個工廠用於生產各式各樣的產品,但是他是靜態的,一旦寫完後就不能改動了,很明顯他並不符合我們的設計理念,縱觀七大設計原則,體現的都是高聚合,低耦合,封閉強,易拓展。這種死板的設計模式怎麼可能爲我們繼續使用呢?於是,工廠方法模式誕生了。工廠方法模式之於簡單工廠模式就好比活字印刷術之於印刷術,更加靈活,可用性高,易拓展。
與簡單工廠不同的是,工廠方法模式中的工廠不必再去負責所有產品的具體創建,而是創建一個虛擬工廠,然後再對其進行實現具體工廠以完成不同產品的創建。這樣做的好處顯而易見,當我們想繼續爲這個工廠添加新產品的時候不需要修改原本的工廠,只需要實現虛擬工廠就可以完成新產品的創建。
2.模式定義
工廠方法模式(Factory Method Pattern)又稱爲工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態工廠(Polymorphic Factory)模式,它屬於創建型模式。在工廠方法模式中,工廠父類負責定義創建產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣做的目的是將產品類的實例化操作延遲到工廠子類中完成。
涉及到的設計原則:
🚀單一職責原則
🦄開閉原則
🎏里氏代換原則
3.模式結構
工廠方法模式包含如下角色:
Product:抽象產品
ConcreteProduct:具體產品
Factory:抽象工廠
-
ConcreteFactory:具體工廠
4.實例演練
這裏我們製作一個形狀工廠,用於生產各式各樣的形狀
-
類圖
- 源碼
Demo:
package com.yinvoker;
public class Demo {
public static void main(String[] args) {
ShapeFactory circleFactory = new CircleFactory();
ShapeFactory rectangleFactory = new RectangleFactory();
ShapeFactory squareFactory = new SquareFactory();
Shape shape1 = circleFactory.createShape("circle");
shape1.draw();
Shape shape2 = rectangleFactory.createShape("rectangle");
shape2.draw();
Shape shape3 = squareFactory.createShape("square");
shape3.draw();
}
}
Running result:
Circle is created
Rectangle is created
Square is created
你可以直接在我的github獲取該實例的源碼及STARUML項目 :)
5.優點 & 缺點
優點:
在工廠方法模式中,工廠方法用來創建客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被實例化這一細節,用戶只需要關心所需產品對應的工廠,無須關心創建細節,甚至無須知道具體產品類的類名。
基於工廠角色和產品角色的多態性設計是工廠方法模式的關鍵。它能夠使工廠可以自主確定創建何種產品對象,而如何創建這個對象的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱爲多態工廠模式,是因爲所有的具體工廠類都具有同一抽象父類。
使用工廠方法模式的另一個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的接口,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要添加一個具體工廠和具體產品就可以了。這樣,系統的可擴展性也就變得非常好,完全符合“開閉原則”。
缺點:
在添加新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的複雜度,有更多的類需要編譯和運行,會給系統帶來一些額外的開銷。
由於考慮到系統的可擴展性,需要引入抽象層,在客戶端代碼中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到DOM、反射等技術,增加了系統的實現難度。
6.適用性
一個類不知道它所需要的對象的類:在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體的產品對象由具體工廠類創建;客戶端需要知道創建具體產品的工廠類。
一個類通過其子類來指定創建哪個對象:在工廠方法模式中,對於抽象工廠類只需要提供一個創建產品的接口,而由其子類來確定具體要創建的對象,利用面向對象的多態性和里氏代換原則,在程序運行時,子類對象將覆蓋父類對象,從而使得系統更容易擴展。
將創建對象的任務委託給多個工廠子類中的某一個,客戶端在使用時可以無須關心是哪一個工廠子類創建產品子類,需要時再動態指定,可將具體工廠類的類名存儲在配置文件或數據庫中。
還想要了解其他設計模式 ?戳這裏!
創建模式 | 結構模式 | 行爲模式 |
---|---|---|
抽象工廠模式 (Abstract Factory) | 適配器模式 (Adapter) | 責任鏈模式 (Chain of Responsibility) |
建造者模式 (Builder) | 橋接模式 (Bridge) | 命令模式 (Command) |
工廠方法模式 (Factory Method) | 組合模式 (Composite) | 解釋器模式 (Interpreter) |
原型模式 (Prototype) | 修飾模式 (Decorator) | 迭代器模式 (Iterator) |
單例模式 (Singleton) | 外觀模式 (Facade) | 中介者模式 (Mediator) |
享元模式 (Flyweight) | 備忘錄模式 (Memento) | |
代理模式(Proxy) | 觀察者模式(Observer) | |
狀態模式 (State) | ||
策略模式 (Strategy) | ||
模板方法模式(Template Method) | ||
訪問者模式 (Visitor) |