1. 程式人生 > >我的設計模式系列----教你讀懂工廠玩法

我的設計模式系列----教你讀懂工廠玩法

info spa trac 不變 等等 動態生成 接受 說過 類型

一、時常聽到各種工廠,解讀工廠

很多人大概從開始工作起,逐漸接觸聽說過各項工廠類名詞,什麽“簡單工廠模式”啊,什麽“靜態工廠方法”啊,什麽“工廠模板”模式啊,什麽“抽象工廠方法”啊,等等

時常聽著一頭霧水,或者一時半知半解,甚至覺得怎麽聽著在玩概念,故弄玄虛一樣。明明聽著有什麽聯系,但又理不清頭緒似的。

其實:

簡單工廠模式(Simple Factory):簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現

[百度百科】

工廠方法模式(Factory Method):是一種常用的對象創建型設計模式,此模式的核心精神是封裝類中不變的部分,提取其中個性化善變的部分為獨立類,通過依賴註入以達到解耦、復用和方便後期維護拓展的目的。它的核心結構有四個角色,分別是抽象工廠;具體工廠;抽象產品;具體產品【百度百科】

抽象工廠模式(Abstract Factory):抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。根據裏氏替換原則,任何接受父類型的地方,都應當能夠接受子類型。因此,實際上系統所需要的,僅僅是類型與這些抽象產品角色相同的一些實例,而不是這些抽象產品的實例。換言之,也就是這些抽象產品的具體子類的實例。工廠類負責創建抽象產品的具體子類的實例【百度百科】

二、3種工廠的意圖及目的

簡單工廠 : 在工廠類中由用戶操作傳入相關參數來動態決定生產那種具體產品實例的過程

技術分享圖片

目的是為了封裝動態生成具體產品實例的過程,使用多態定義N種具體產品實例,而在用戶選擇時動態決定最後去創建那種具體產品實例的過程。

優點:封裝了工廠類中相關判斷邏輯,解除了客戶端與具體產品的耦合,客戶端只要給對應選擇條件,工廠類會根據對應條件動態實例化具體產品類

缺點:當突然有新的具體產品引入的時候除需要引入新的產品實例類,還需要變更工廠類中動態生產具體產品實例的部分,違反了軟件設計之開-閉原則

工廠方法模式 :定義一個用於創建對象的接口,讓子類決定實例化哪個類。工廠方法使一個類的實例化延遲到其子類。

主要是為了解決簡單工廠中因新產品加入時變更工廠類邏輯而違背開閉原則的設計

優點:將具體產品的實例化延遲至具體工廠中完成,在子類中決定實例化。這樣當有新產品引入時不用變更工廠邏輯,而只需要添加新的具體工廠即可。解決了簡單工廠中破壞的開-閉原則的問題

每個具體工廠只負責具體產品的實例化,符合軟件設計的單一職責原則

缺點:當引入具體產品時,會引入具體工廠子類,增加了代碼的復雜度

當工廠改產品線由原只生產A變更為只生產B時,仍然需要變更產品B的具體工廠類

一個具體工廠只能生產一個具體的產品

抽象工廠:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類

主要為了解決工廠方法中一個具體工廠只能實例化一個具體產品的缺陷

優點:相對工廠方法模式,抽象工廠模式支持某個產品序列,而工廠方法只針對某一具體產品

當需要變更產品系列(多個產品)時,只需要變更具體工廠類即可。改動非常小且非常容易,符合開閉原則

客戶端與具體實例的創建完全分離,整個產品創建過程只與具體工廠的接口定義有關(而與是那個具體產品無關),典型面向接口而非面向實現,符合這依賴倒置原則。

缺點:新增加具體產品時,改動會非常大,需要增加一個抽象產品類及該產品類的實現,同時還需要更改抽象工廠類(添加生產該產品的方法)以及具體工廠類(添加生產該產品的方法實現)。

三、各工廠對應的UML圖及主要角色

簡單工廠模式

四、各工廠對應代碼示例說明

我的設計模式系列----教你讀懂工廠玩法