02 工廠方法模式

2021-09-29 21:48:32 字數 2083 閱讀 8920

結構

product(抽象產品):它是定義產品的介面,是工廠方法模式所建立物件的超型別,也就是產品物件的公共父類。

concreteproduct(具體產品):它實現了抽象產品介面,某種型別的具體產品由專門

的具體工廠建立,具體工廠和具體產品之間一對應。

factory(抽象工廠):在抽象工廠類中宣告了工廠方法(factory method),用於返回乙個產品。抽象工廠是工廠方法模式的核心,所有建立物件的工廠類都必須實現該介面。

concretefactory(抽象工廠):它是抽象工廠類的子類,實現了在抽象工廠中宣告的工廠方法,並可以由客戶端呼叫,返回乙個具體產品的例項。 **

抽象產品

public inte***ce product
具體產品a

public class concreteproducta implements product 

}

具體產品b

public class concreteproductb implements product 

}

抽象工廠

public inte***ce factory
具體工廠a

public class concretefactorya implements factory

}

具體產品b

public class concretefactoryb implements factory

}

客戶端呼叫

public class client 

}

擴充套件

新建具體產品c

public class concreteproductc implements product 

}

新建具體工廠c

public class concretefactoryc implements factory

}

呼叫

factory factoryc = new concretefactoryc();

product productc = factoryc.factorymethod();

productc.productmethod();

優/缺點與使用環境

在工廠方法模式中,工廠方法用建立客戶端所需要的產品,同時還向客戶端隱藏了哪種具體產品類將被例項化這一細節,使用者只需要關心所需產品對應的工廠,無須關心建立細節,甚至無需知道具體產品類的類名。

基於工廠角色和產品角色的多型性設計是工廠方法模式的關鍵。它能夠讓工廠自 主確定建立何種產品物件,而如何建立這個物件的細節完全封裝在具體工廠內部。工廣方法模式之所以又被稱為多型工廠模式,正是因為所有的具體工廠類都具有同一抽象父類

使用工廠方法模式的另乙個優點是在系統中加入新產品時無須修改抽象工廠和 抽象產品提供的介面,無須修改客戶端,也無須修改其他的具體工廠和具體產品。而只要新增乙個具體工廠和具體產品類,這樣系統的擴充套件性也就變得非常好,完全符合開閉原則。

在新增新產品時需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類, 系統中類的個數將成對增加,在一定程度上增加了系統的複雜度,有更多的類需要編譯和執行,會給系統帶來一些額外的開銷。

由於考慮到系統的可擴充套件性,需要引入抽象層,在客戶端**中均使用抽象層進行定義,增加了系統的抽象性和理解難度。

客戶端不知道它所需要的物件的類。在工廠方法模式中,客戶端不需要知道具體 產品類的類名,只需要知道所對應的工廠即可,具體產品物件由具體工廠類建立,可將具體工廠類的類名儲存在配置檔案或資料庫中。

抽象工廠類通過其子類來指定建立哪個物件。在工廠方法模式中,對於抽象工廠 類只需要提供乙個建立產品的介面,而由其子類來確定具體要建立的物件.利用物件導向的多型性和黎克特制代換原則,在程式執行時子類物件將覆蓋父類物件,從而使得系統更容易擴充套件。

02 工廠方法模式

1.什麼是工廠方法模式 工廠方法模式同樣屬於類的建立型模式又被稱為多型工廠模式 工廠方法模式的意義是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類當中。核心工廠類不再負責品的建立,這樣核心類成為乙個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以...

工廠方法模式 工廠方法模式

工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...

設計模式 02工廠方法設計模式

場景 使用者需要下單美國披薩,中國披薩,前乙個簡單工廠模式就不是能很好的滿足現在的需求了。pizza頂級父類 public abstract class pizza public void cut public void box public pizza setname string name 不同...