工廠方法模式 (Factory Method)

1.模式起因

在瞭解工廠方法模式前不得不提的就是簡單工廠模式,簡單工廠模式就是建造了一個工廠用於生產各式各樣的產品,但是他是靜態的,一旦寫完後就不能改動了,很明顯他並不符合我們的設計理念,縱觀七大設計原則,體現的都是高聚合,低耦合,封閉強,易拓展。這種死板的設計模式怎麼可能爲我們繼續使用呢?於是,工廠方法模式誕生了。工廠方法模式之於簡單工廠模式就好比活字印刷術之於印刷術,更加靈活,可用性高,易拓展。

與簡單工廠不同的是,工廠方法模式中的工廠不必再去負責所有產品的具體創建,而是創建一個虛擬工廠,然後再對其進行實現具體工廠以完成不同產品的創建。這樣做的好處顯而易見,當我們想繼續爲這個工廠添加新產品的時候不需要修改原本的工廠,只需要實現虛擬工廠就可以完成新產品的創建。

2.模式定義

工廠方法模式(Factory Method Pattern)又稱爲工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態工廠(Polymorphic Factory)模式,它屬於創建型模式。在工廠方法模式中,工廠父類負責定義創建產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣做的目的是將產品類的實例化操作延遲到工廠子類中完成。

涉及到的設計原則:

  • 🚀單一職責原則

  • 🦄開閉原則

  • 🎏里氏代換原則

3.模式結構

工廠方法模式包含如下角色:

  • Product:抽象產品

  • ConcreteProduct:具體產品

  • Factory:抽象工廠

  • ConcreteFactory:具體工廠

4.實例演練

這裏我們製作一個形狀工廠,用於生產各式各樣的形狀

  1. 類圖

  1. 源碼

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章