define an inte***ce for creating an object, but let subclasses decide which class to instantiate. factory method lets a class defer instantiation to subclasses.
(定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲到其子類。)
定義抽象產品類:
class
product
//抽象方法
virtual
void
method2()
=0;}
;
定義具體產品類:
class
concreateproduct1
:public product };
class
concreateproduct2
:public product
};
定義抽象工廠類:
template
<
class
abspro
>
class
creator
;
定義具體工廠類:
template
<
class
abspro
,class
conpro
>
class
concretecreator
:public creator
};
場景呼叫類:
concretecreator pc;
product *p = pc.
createproduct()
;p->
method2()
;
良好的封裝性,**結構清晰。根據產品的類名即可得到產品物件;
擴充套件性非常優秀。需要增加產品類時,只要適當地修改具體的工廠類或擴充套件乙個工廠類就可以實現;
遮蔽產品類。呼叫者不需要關係產品類的實現,產品類的實現由工廠類完成;
典型的解耦框架。
工廠方法模式是new乙個物件的替代品,所以在所有需要生成物件的地方都可以使用,但是需要考慮複雜度;
需要靈活的,可擴充套件的框架時;
可以用在異構專案中;
使用在測試驅動開發的框架下;
1 簡單工廠模式
當乙個模組只需要乙個工廠類,即刪除抽象工廠類,乙個工廠固定的加工生產某一種抽象產品。
不符合開閉原則。
沒有完美的模式,簡單且符合需求即是完美。
2 公升級為多個工廠類
為產品類增加適配其對應的工廠類來完成每個產品具體實現,比較合適產品類的初始化都不相同的情況下。
3 替代單例模式
4 延遲初始化
通過map將已經建立的產品類物件保留快取,然後下一次如果需要獲取物件,先判斷map中是否存在,如果存在則直接取出返回,否則按需產生乙個物件並放入到map容器中,方便下次呼叫。
#include
using
namespace std;
class
human
;class
black
:public human
virtual
void
talk()
};class
yellow
:public human
virtual
void
talk()
};class
white
:public human
virtual
void
talk()
};template
<
class
abshuman
>
class
abstracthumanfactory
;template
<
class
abshuman
,class
conhuman
>
class
humanfactory
:public abstracthumanfactory};
intmain()
二十三種設計模式之工廠模式
工廠模式的核心 例項化物件 原因 有些物件不能直接例項化,比如介面 抽象類及複雜物件的其他依賴 核心 呼叫工廠class的靜態方法例項化物件 以日誌為例 public class staticfactory 核心 先建立工廠物件,之後呼叫工廠方法 例項化工廠模式 public class insta...
二十三種設計模式2 抽象工廠模式
工廠方法模式有乙個問題就是,類的建立依賴工廠類,也就是說,如果想要拓展程式,必須對工廠類進行修改,這違背了閉包原則,所以,從設計角度考慮,有一定的 問題,如何解決?就用到抽象工廠模式,建立多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的 因為抽象工廠不太 好理解,我...
二十三種設計模式 羅列
1 工廠方法模式 factory method 2 抽象工廠模式 abstract factory 3 單例模式 singleton 4 建造者模式 builder 5 原型模式 prototype 6 介面卡模式 adapter 7 裝飾模式 decorator 8 模式 proxy 9 外觀模式...