工廠方法模式(通俗易懂)待修改

2021-09-18 01:33:56 字數 2730 閱讀 7229

在上文提到的最易懂的設計模式系列解析:簡單工廠模式,發現簡單工廠模式存在一系列問題:

為了解決上述的問題,我們又使用了一種新的設計模式:工廠方法模式。

在閱讀下文前強烈建議先閱讀最易懂的設計模式系列解析:簡單工廠模式

1.1 定義

工廠方法模式,又稱工廠模式、多型工廠模式和虛擬構造器模式,通過定義工廠父類負責定義建立物件的公共介面,而子類則負責生成具體的物件。

1.2 主要作用

將類的例項化(具體產品的建立)延遲到工廠類的子類(具體工廠)中完成,即由子類來決定應該例項化(建立)哪乙個類。

1.3 解決的問題

工廠一旦需要生產新產品就需要修改工廠類的方法邏輯,違背了「開放 - 關閉原則

簡單工廠模式的缺點

之所以可以解決簡單工廠的問題,是因為工廠方法模式把具體產品的建立推遲到工廠類的子類(具體工廠)中,此時工廠類不再負責所有產品的建立,而只是給出具體工廠必須實現的介面,這樣工廠方法模式在新增新產品的時候就不修改工廠類邏輯而是新增新的工廠子類,符合開放封閉原則,克服了簡單工廠模式中缺點

2.1 uml類圖

2.2 模式組成

組成(角色)

關係作用

抽象產品(product)

具體產品的父類

描述具體產品的公共介面

具體產品(concrete product)

抽象產品的子類;工廠類建立的目標類

描述生產的具體產品

抽象工廠(creator)

具體工廠的父類

描述具體工廠的公共介面

具體工廠(concrete creator)

抽象工廠的子類;被外界呼叫

描述具體工廠;實現factorymethod工廠方法建立產品的例項

2.3 使用步驟

步驟1:建立抽象工廠類,定義具體工廠的公共介面; 

步驟2:建立抽象產品類,定義具體產品的公共介面; 

步驟3:建立具體產品類(繼承抽象產品類) & 定義生產的具體產品; 

步驟4:建立具體工廠類(繼承抽象工廠類),定義建立對應具體產品例項的方法; 

步驟5:外界通過呼叫具體工廠類的方法,從而建立不同具體產品類的例項

接下來我用乙個例項來對工廠方法模式進行更深一步的介紹。

3.1 例項概況

3.2 使用步驟

步驟1:建立抽象工廠類,定義具體工廠的公共介面

abstract

class

factory

步驟2:建立抽象產品類,定義具體產品的公共介面;

abstract

class

product

步驟3:建立具體產品類(繼承抽象產品類), 定義生產的具體產品;

//具體產品a類

class

producta

extends

product

}//具體產品b類

class

productb

extends

product

}

步驟4:建立具體工廠類(繼承抽象工廠類),定義建立對應具體產品例項的方法;

//工廠a類 - 生產a類產品

class

factorya

extends

factory

}//工廠b類 - 生產b類產品

class

factoryb

extends

factory

}

步驟5:外界通過呼叫具體工廠類的方法,從而建立不同具體產品類的例項

//生產工作流程

public

class

factorypattern

}

結果:

生產出了產品a

生產出了產品c

總結:工廠模式可以說是簡單工廠模式的進一步抽象和拓展,在保留了簡單工廠的封裝優點的同時,讓擴充套件變得簡單,讓繼承變得可行,增加了多型性的體現。

在了解了優缺點後,我總結了工廠方法模式的應用場景:

本文主要對工廠方法模式進行了全面介紹,接下來將介紹其他設計模式,有興趣可以繼續關注carson_ho的安卓開發筆記!!!!

通俗易懂說設計模式(2)簡單工廠模式

5.缺點 6.c 示例 簡單工廠模式並不是23種設計模式之一,它只能算工廠模式的乙個特殊實現。水果攤 抽象產品 可以賣很多種水果,如蘋果香蕉,梨 顧客買水果 具體的產品 通過水果攤買水果 派生 產生具體的水果,如蘋果 水果種植廠 工廠 根據市場客戶需求,種植具體的水果 需要建立的物件較少 客戶端不關...

通俗易懂設計模式解析 模板方法模式

在我們平時的系統開發中,經常會遇到一些方法,出現大部分一樣的 也就是常常有一些穩定的框架結構,但是其中的一些細小的操作卻是在變化。我們現在如何在穩定框架結構的前提下去實現不同的細節呢?定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法...

通俗易懂的理解MVC模式

mvc由view檢視,controller控制器,model模型三部分組成。當使用者與view進行互動的時候,會觸發view的一些事件,這些事件會被controller模組監聽到,controller會根據不同的使用者事件去呼叫model層的一些介面,通過這些介面修改model層的資料。在之前vie...