定義:
定義了乙個建立物件的介面,但是由子類來決定要例項化的是哪乙個類。工廠方法使類的例項化延遲到子類中。通用類圖:
工廠方法中的角色:
通用**示例:
public
abstract
class
product
public
abstract
void
method2()
;}
public
class
concreteproducta
extends
product
}
public
class
concreteproductb
extends
product
}
public
abstract
class
creator
public
class
concretecreator
extends
creator
catch
(exception e)
return
(t)product;
}}
public
class
client
}
舉例東漢《風俗通》記載:「開天闢地,未有人民,女媧搏黃土做人」,講的就是女媧造人的神話故事,開天闢地之處,大地上並沒有生物,只有蒼茫大地,潔淨的自然環境,寂靜又寂寞,女媧決定創造新的物種來增加世界的繁榮。於是女媧採集黃土,捏**形,放入八卦爐中燒製,然後放置於大地上生長,人類便誕生了。
在這個過程當中人類就是product角色,八卦爐就是工廠類角色,人類分為白種人、黑種人、黃種人,類圖設計如下:
實現**:
public
inte***ce
human
public
class
blackhuman
implements
human
@override
public
void
talk()
}
public
class
whitehuman
implements
human
@override
public
void
talk()
}
public
class
yellowhuman
implements
human
@override
public
void
talk()
}
/**
* 抽象人類工廠
*/public
abstract
class
abstracthumanfactory
/**
* 人類工廠實現類
*/public
class
humanfactory
extends
abstracthumanfactory
catch
(exception e)
return
(t) human;
}}
public
class
nvwa
}
工廠方法模式的優缺點工廠方法模式具有非常好的擴充套件性,在抽象工廠基類中指定了建立物件的約束方法,但不提供建立過程,而是由子類去實現創造過程,跟具體的產品實現類完全解耦,工廠高層模組和低層模組嚴格依賴抽象,符合依賴倒置原則,同時也符合迪公尺特法則(呼叫者減少和具體產品類打交道)和裡式替換原則(產品子類替換產品父類不會有問題)。
工廠方法模式也有缺點,那就是建立乙個類的物件需要另乙個類來進行管理,增加**的複雜度。所以在選擇工廠方法模式的時候要注意取捨,如果使用new建立的物件就可以滿足需求的話就不需要工廠方法模式,如果你需要的是可靈活性擴充套件的框架可以考慮工廠方法模式。
簡單工廠模式
如果實際當中只需要乙個工廠類,那麼就不需要抽象的工廠基類,可以把建立產品的方法改為靜態方法。
女媧造人例子的修改為簡單工廠:
public
class
humanfactory
catch
(exception e)
return
(t) human;
}}
public
class
nvwa
}
**變的比前面簡單的多,簡單工廠看上去像乙個工具類方法,雖然它失去了可擴充套件性不符合開閉原則,但是卻比較實用,這需要根據你的需求當你確定模組中只需要乙個工廠類時採用。
多個工廠類
在實際當中如果初始化建立物件的過程比較複雜,比如不同的產品可能會設定不同的引數,這個時候建立產品的方法不能共用,所以這時就需要為每乙個產品類建立乙個工廠類。
女媧造人例子的修改為多工廠類:
public
abstract
class
abstracthumanfactory
public
class
blackhumanfactory
extends
abstracthumanfactory
}
public
class
whitehumanfactory
extends
abstracthumanfactory
}
public
class
yellowhumanfactory
extends
abstracthumanfactory
}
public
class
nvwa
}
多工廠職責比較清晰簡單,但是也有缺點就是降低可維護性,因為產品類和工廠類數量相同,每增加乙個產品類就需要增加乙個工廠類。
可生成單例模式的工廠類
既然工廠方法是用來生產物件的,那麼就可以對工廠方法做簡單的修改,只返回乙個物件,就變成了單例模式:
/**
* 單例類
*/public
class
singleton
public
void
dosomething()
}
public
class
singletonfactory
catch
(exception e)
}public
static singleton getsingleton()
}
**中工廠類利用反射生成了乙個單例模式的物件。
可復用快取的工廠類
如果建立物件的過程比較複雜,或者非常耗時,可以在工廠類內部對已建立的物件進行快取,以備下次使用。
public
class
productfactory
else
else
//把建立的物件快取起來
productmap.
put(type, product);}
return product;
}}
**中建立了乙個map物件來快取產品物件,當建立產品物件的時候,同時將產品物件快取到map當中,這樣當下次再次需要獲取產品物件的時候,如果map當中有快取就直接從map中獲取。
這樣的好處是,如果產品物件的建立過程比較複雜耗時,就可以加快互動過程,不需要等待建立完畢,直接使用已建立好的物件,還有乙個好處是可以控制最大產品數量,當產品類物件需要占用很高的記憶體時,這會非常有用,它可以節約和限制你的記憶體使用。
參考:
工廠方法模式 工廠方法模式
工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...
工廠方法模式 工廠方法模式 二
工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...
工廠方法模式(一) 簡單工廠方法模式
ps 第二篇學習部落格,堅持就是勝利。繼續設計模式的學習,記錄工廠模式,加深自己的理解。基本結構 abstractproduct 用來定義基本的商品的抽象 public abstract class abstractphoneproduct 用來實現抽象商品,生成各種商品 public class ...