1. 程式人生 > >工廠方法模式 建立型 設計模式(三)

工廠方法模式 建立型 設計模式(三)

  工廠方法模式是簡單工廠模式的進一步抽象 工廠方法模式既保持了簡單工廠模式的優點,又克服了他的缺點 如不清楚簡單工廠模式,可以檢視前一篇 他是怎麼做到的呢?那就是: 核心的工廠角色,不再是具體的工廠,也就是不再負責所有具體產品的建立,進一步轉變為抽象角色。 他僅僅提供具體工廠子類必須實現的介面  ,不再關心應該例項化哪個具體的產品類 具體建立的工作的細節全部交給子類工廠去做 簡言之, 從一個類包打天下(簡單工廠模式),轉換為兄弟姐妹一起上(工廠方法)

意圖

定義一個用於建立物件的介面,讓子類決定例項化哪一個類 工廠方法模式使一個類的例項化,延時到其子類(就是在說,子類負責具體產品類的例項化)
別名:虛構造器  

結構

image_5be8fa74_7142   抽象產品Product 產品抽象角色,工廠建立具體的物件的超類或共同介面 具體產品ConcreteProduct 實現了抽象產品Product,ConcreteProduct1 和ConcreteProduct2為具體的產品 抽象工廠Creator 工廠模式的核心,與應用程式無關,所有的工廠都需要實現抽象工廠角色 具體工廠ConcreteCreator 實現了工廠介面的具體的Java類,用於產生具體的產品   工廠模式相對於簡單工廠模式,產品側的結構形式不變 而對於工廠,變化很清晰明顯 不再是單一的Java類承擔所有的物件建立職責
而是存在工廠的體系結構 Creator作為建立工廠的抽象角色,提供了建立協議,也就是一個方法,約定了我們將要建立什麼範疇的產品 ConcreteCreator1和ConcreteCreator2 是具體的工廠,他們都實現Creator,針對不同的產品有不同的工廠  也就是 產品等級結構是什麼樣的,就有一個類似結構的工廠等級結構 對應著的工廠建立對應著的產品 就像上圖中那樣,兩個圈中的層級結構是對稱的,一 一對應的 Creator對應Product ConcreteCreator1對應ConcreteProduct1 ConcreteCreator2對應ConcreteProduct2 ......    

示例程式碼

還是以水果的為例 Fruit Apple Orange與簡單工廠模式中一樣 此時,不再是一個水果店賣所有的水果,而是不同的水果店銷售不同的水果 所以對應水果這種產品的等級結構,也有對應的工廠等級結構 Factory以及 AppleFactory和 OrangeFactory image_5be8fa74_2504 Fruit Apple 和Orange與簡單工廠中的程式碼相同,請參見上一篇文章,不再贅述
package factory;
/**
* Created by noteless on 2018/10/9.
* Description:
*/
public interface Factory {
Fruit create();
}

 

package factory;
/**
* Created by noteless on 2018/10/9.
* Description:
*/
public class AppleFactory implements Factory {
@Override
public Fruit create() {
return new Apple();
}
}

 

package factory;
/**
* Created by noteless on 2018/10/9.
* Description:
*/
public class OrangeFactory implements Factory {
@Override
public Fruit create() {
return new Orange();
}
}

 

測試程式碼 image_5be8fa74_11cd   工廠方法模式的特點就是平行的等級結構 ,也就是工廠與產品有相對應的層級結構 而不是像簡單工廠模式中那樣,一個全能類包攬所有建立邏輯  

對比

工廠方法模式,不再將邏輯都集中在一個具體的工廠類上 而是藉助於抽象的工廠角色Creator,他是一個抽象角色,所有的工廠建立行為分佈於他的實現類上 是簡單工廠模式的進一步抽象   對於工廠模式來說,如果省略抽象角色Creator,也就好像成了一個或者多個的簡單工廠模式 每個工廠類似一個簡單工廠模式 所以 某種程度上說,簡單工廠模式是工廠方法模式的一個簡化形式或者說特例形式   工廠方法模式構造了一個建立物件的工廠框架 與產品等級結構對應的工廠等級結構不就是相等於一個建立框架嘛 由不同的子類工廠來具體化物件的建立 工廠方法模式還有一個名字叫做 多型性工廠模式 因為具體的工廠都有共同的介面或者共同的抽象父類,具體產品物件由具體的工廠子類建立 建立一個Creator引用指向實際的Creator子類例項,實際建立的物件根據工廠的多型性產生   如果系統需要加入一個新的產品時,只需要加入一個新的產品類以及對應的工廠類即可不需要修改已有的抽象工廠角色,也沒必要修改其他的具體的工廠角色 更沒必要修改客戶端的程式碼,所以滿足了開閉原則 而且 , 每個工廠生產一種對應的產品,也符合單一職責原則    在實踐中隨著業務模式的深入變得複雜, 如果有多個簡單工廠模式,如果他們在某些方面有共性 也是可以考慮將多個簡單工廠模式的應用提升為工廠模式的

總結

工廠模式構造了一個與產品等級結構相同的工廠結構,每個子類工廠建立對應的具體產品 工廠模式是簡單模式的進一步抽象 所以想要理解工廠模式只需要理解清楚簡單工廠模式即可 工廠模式就是把簡單工廠模式中的一類多能,上帝模式,轉換為多個工廠類例項分攤職責 可以認為簡單工廠模式相當於封建專制,皇帝一個人說了算 工廠模式就相當於民主制度下了,大家群策群力一起討論,每個人負責一塊   抽象工廠角色Creator,可以使用介面也可以使用抽象類(不要用具體的類,因為這本身就是一個抽象角色) 如果具體的工廠之間有相同的邏輯 那麼這些邏輯應該被提取到抽象類中 否則,就應該使用介面的形式作為抽象工廠角色Creator和抽象產品角色Product   需要注意的是,有很多類提供了很多的方法都能夠返回一個具體的物件 比如toString方法,返回一個String 那些算是工廠模式麼? 嚴格的說那些並不屬於工廠方法模式 方法是業務邏輯處理,重點在於業務邏輯,而不在於物件的建立 出發點邏輯思想不是一回事,當然,這只是個人看法,是不是都沒什麼很大爭執的必要