簡單原廠模式
A.定義:
定義一個用於建立對象的介面.
B.定義分析:
"定義一個用於建立對象的介面". 這個模式的應用主要是定義一個介面,每個類都會有介面,對於物件導向語言就是定義一個類,這個類裡有個介面.
"定義一個用於建立對象的介面".定義的這個類中含有的介面,是什麼功能呢?用於建立對象.什麼樣的介面叫做用於建立對象的介面呢?比如:SimpleFactory類的newProduct介面這樣實現:
AbstractProduct* SimpleFactory::newProduct(const char* name) {
if(0 == strcmp(name, "A")) {
return new ConcreteProductA();
}
}
newProduct就是建立對象的介面,也就是把new的過程拿到了newProduct介面中.
C.問題
(1)為什麼要把對象new的過程拿到newProduct這樣的簡單工廠類的介面裡?直接在使用的代碼處new一個對象不行嗎?
直接在代碼裡new一個對象是可以的.問題是
如果ConcreteProductA這個類的名字修改了呢?所有用到ConcreteProductA類的代碼都要修改;
如果ConcreteProductA的使用並不合理呢?所有用到ConcreteProductA類的代碼都要修改;
如果客戶並不知道ConcreteProductA這個類的名字或者我們不想客戶知道ConcreteProductA的實現細節呢?
...諸如此類的重構或者設計問題.
所有這些問題的根源在於,ConcreteProductA相關會發生變化,發生變化時,系統的靈活性不夠,會造成重構的困難.
解決辦法是:不讓客戶知道 ConcreteProductA的存在,只需要使用AbstractProduct提供的介面,具體的product類通過工廠介面類建立.這樣客戶代碼和具體product沒有任何依賴了,也就不存在重構上的問題.
(2)可以不定義類,只使用newProduct這樣的介面不?
可以的.但是有些語言是不能有全域方法的,只能用類這樣的形式.
(3)簡單工廠有沒有什麼弊端?
有的.當新增了產品類型時,需要更改工廠介面newProduct.且當產品類別很多時,簡單工廠不是很適用.