簡單工廠模式:靜態工廠方法模式;
工廠方法模式:多態性工廠模式、虛擬構造子模式;
抽象工廠模式:工具箱模式;
簡單工廠模式
有工廠角色,抽象產品角色,具體產品角色。
工廠類根據傳入的參量,決定具體創建哪一類的實例。
當多抽象類、具體類的時候,一律使用同一個工廠。
好處:產品的等級結構不會傳遞到工廠類中;
缺點:增加產品必須修改工廠類;
一個工廠類可以有多個工廠方法,分別創建不同的產品對象,java.text.DateFormat 就提供了多個靜態工廠方法;
工廠角色與抽象產品角色的合併
java.text.DateFormat 一個抽象產品類,同時是子類的工廠;
如果抽象產品角色被省略了,那麼工廠角色可以與具體角色合併(與單例、多例相似,但不等於單例、多例);
產品對象的循環使用和登記式的工廠方法
工廠可以循環使用已經創建出的對象;
工廠方法模式
抽象工廠角色,具體工廠角色,抽象產品角色,具體產品角色;
所有工廠角色的等級與產品角色的等級相同;
一個具體產品對應一個具體工廠,
如果需要新增一個產品,那麼需要同時新增一個對應的工廠;
使用接口或抽象類
將公共代碼向上抽取
使用多個工廠方法
使用不同的工廠方法,實現不同的商業邏輯
命名時要體現是用了工廠模式
產品的循環使用
工廠對象需要將已經創建過多的對象登記到一個聚集裏,以後相同的條件就直接到聚集裏查詢就可以了。— 享元模式就使用了這種工廠模式
抽象工廠模式
抽象工廠角色,具體工廠角色,抽象產品角色,具體產品角色;
抽象產品A:具體產品A1,A2。
抽象產品B:具體產品B1,B2。
抽象工廠:兩個方法 1.生產A類 2.生產B類
兩個具體工廠實現抽象工廠:工廠1生產A1和B1、工廠2生產A2、B2;
AB是不同的接口,1、2是不同的產品族;
對開閉原則的支持
- 增加新的產品族,以上面的例子爲例,增加一個產品族3,這時候,只需要增加具體產品3,和具體工廠3,不需要修改原有的工廠類,支持開閉原則;
- 增加新的產品等級結構,也就是增加抽象產品C,這時候需要修改所有的工廠類,增加方法,這樣是不滿足開閉原則的;
具體工廠本身可以設計成單例類
抽象工廠可以配備靜態方法根據參數返回具體工廠的實例