建立型模式————工廠方法模式
1.由來
簡單工廠模式中,每個按鈕收拾由按鈕工廠類來統一的負責所有的產品建立,現在我們將這個建立交給專門的工廠子類去完成,我們先定義一個抽象的按鈕工廠類,在定義一個工廠類來生成圓形按鈕,矩形按鈕,方形按鈕等,它們實現在抽象按鈕中定義的方法, 這種抽象化的結果使這種結構可以在不修改具體工廠類的情況下引進新的產品,如果出現新的按鈕型別,只需要為這種新型別的按鈕建立一個具體的工廠類就可以獲得該新按鈕的例項,這一特點無疑使得工廠方法模式具有超越簡單工廠模式的優越性,更加符合“開閉原則”。
2.定義
工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多型工廠(Polymorphic Factory)模式。在工廠方法模式中,工廠父類負責定義建立產品物件的公共介面,而工廠子類則負責生成具體的產品物件,這樣做的目的是將產品類的例項化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該例項化哪一個具體產品類。
3.程式碼的實現
public abstract class Factory {
public abstract Factory getFactory();
}
class AFactory extends Factory{
@Override
public Factory getFactory() {
return new AFactory();
}
}
(自己寫的例項看起來有點low,不過看著好理解,下面的是C++的實現形式)
#include "ConcreteFactory.h"
#include "ConcreteProduct.h"
Product* ConcreteFactory::factoryMethod(){
return new ConcreteProduct();
}
#include "Factory.h"
#include "ConcreteFactory.h"
#include "Product.h"
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
Factory * fc = new ConcreteFactory();
Product * prod = fc->factoryMethod();
prod->use();
delete fc;
delete prod;
return 0;
}
4.模式的優點
- 在工廠方法模式中,工廠方法用來建立客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被例項化這一細節,使用者只需要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名。
- 基於工廠角色和產品角色的多型性設計是工廠方法模式的關鍵。它能夠使工廠可以自主確定建立何種產品物件,而如何建立這個物件的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多型工廠模式,是因為所有的具體工廠類都具有同一抽象父類。
- 使用工廠方法模式的另一個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的介面,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要新增一個具體工廠和具體產品就可以了。這樣,系統的可擴充套件性也就變得非常好,完全符合“開閉原則”。
5.模式的缺點
- 在新增新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的複雜度,有更多的類需要編譯和執行,會給系統帶來一些額外的開銷。
- 由於考慮到系統的可擴充套件性,需要引入抽象層,在客戶端程式碼中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到DOM、反射等技術,增加了系統的實現難度。
6.應用的場景
- 一個類不知道它所需要的物件的類:在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體的產品物件由具體工廠類建立;客戶端需要知道建立具體產品的工廠類。
- 一個類通過其子類來指定建立哪個物件:在工廠方法模式中,對於抽象工廠類只需要提供一個建立產品的介面,而由其子類來確定具體要建立的物件,利用物件導向的多型性和里氏代換原則,在程式執行時,子類物件將覆蓋父類物件,從而使得系統更容易擴充套件。
- 將建立物件的任務委託給多個工廠子類中的某一個,客戶端在使用時可以無須關心是哪一個工廠子類建立產品子類,需要時再動態指定,可將具體工廠類的類名儲存在配置檔案或資料庫中。
相關文章
- 建立型:工廠模式-工廠方法、抽象工廠模式抽象
- 設計模式-建立型-工廠方法設計模式
- 建立型:工廠模式-簡單工廠模式
- 建立型設計模式——抽象工廠模式設計模式抽象
- 設計模式--工廠模式Factory(建立型)設計模式
- 建立型模式:工廠方法模式
- JAVA設計模式 3【建立型】理解工廠模式與抽象工廠模式Java設計模式抽象
- Factory Method 工廠方法模式(建立型模式)模式
- C++設計模式建立型工廠模式C++設計模式
- python--設計模式--4--建立型--工廠方法模式Python設計模式
- 工廠方法模式GoF23種設計模式之建立型模式之工廠方法模式Go設計模式
- 設計模式-工廠模式二(工廠方法模式)設計模式
- 設計模式-簡單工廠、工廠方法模式、抽象工廠模式設計模式抽象
- 建立模式 01-工廠模式模式
- 建立型模式——抽象工廠模式模式抽象
- 設計模式之工廠方法模式|抽象工廠模式設計模式抽象
- 設計模式之工廠模式!深入解析簡單工廠模式,工廠方法模式和抽象工廠模式設計模式抽象
- 設計模式-建立型模式-工廠模式(工廠三兄弟) TypeScript設計模式TypeScript
- 建立型模式-單例模式-工廠模式模式單例
- 一篇搞定工廠模式【簡單工廠、工廠方法模式、抽象工廠模式】模式抽象
- 工廠方法模式模式
- 【Python設計模式】03 工廠模式:建立建立物件的工廠Python設計模式物件
- 抽象工廠模式-與-工廠方法模式區別抽象模式
- Java 設計模式之工廠方法模式與抽象工廠模式Java設計模式抽象
- 設計模式 - 工廠方法模式設計模式
- 設計模式-工廠方法模式設計模式
- 設計模式~~~工廠方法模式設計模式
- 設計模式——工廠方法模式設計模式
- 【設計模式】工廠方法模式設計模式
- 簡單工廠模式、工廠方法模式和抽象工廠模式有何區別?模式抽象
- 建立型模式:抽象工廠模式抽象
- 工廠方法模式與抽象工廠模式的區別模式抽象
- 工廠方法模式(FactoryMethod)模式
- java設計模式-工廠方法模式Java設計模式
- 設計模式之工廠方法模式設計模式
- 簡單工廠和工廠方法模式模式
- 設計模式學習(二)工廠模式——工廠方法模式+登錄檔設計模式
- 簡單工廠模式、工廠模式、抽象工廠模式比較模式抽象