設計模式 工廠模式

2021-08-08 16:59:17 字數 3118 閱讀 4460

在簡單工廠模式中只提供乙個工廠類,該工廠類處於對產品類進行例項化的中心位置,它需要知道每乙個產品物件的建立細節,並決定何時例項化哪乙個產品類。簡單工廠模式最大的缺點是當有新產品要加入到系統中時,必須修改工廠類,需要在其中加入必要的業務邏輯,這違背了「開閉原則」。此外,在簡單工廠模式中,所有的產品都由同乙個工廠建立,工廠類職責較重,業務邏輯較為複雜,具體產品與工廠類之間的耦合度高,嚴重影響了系統的靈活性和擴充套件性,而工廠方法模式則可以很好地解決這一問題。

工廠方法模式(factory method pattern):定義乙個用於建立物件的介面,讓子類決定將哪乙個類例項化。工廠方法模式讓乙個類的例項化延遲到其子類。工廠方法模式又簡稱為工廠模式(factory pattern),又可稱作虛擬構造器模式(virtual constructor pattern)或多型工廠模式(polymorphic factory pattern)。工廠方法模式是一種類建立型模式。

product(抽象產品):它是定義產品的介面,是工廠方法模式所建立物件的超型別,也就是產品物件的公共父類。**以計算器的簡單實現為例:

/// /// 運算類

///

class operation

set

}public double numberb

set

}/// /// 得到運算結果

///

///

public virtual double getresult()

}

concreteproduct(具體產品):它實現了抽象產品介面,某種型別的具體產品由專門的具體工廠建立,具體工廠和具體產品之間一一對應。

/// /// 加法類

///

class operationadd : operation

}/// /// 減法類

///

class operationsub : operation

}/// /// 乘法類

///

class operationmul : operation

}/// /// 除法類

///

class operationdiv : operation

}

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

/// /// 工廠方法

///

inte***ce ifactory

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

/// /// 專門負責生產「+」的工廠

///

class addfactory : ifactory

}/// /// 專門負責生產「-」的工廠

///

class subfactory : ifactory

}/// /// 專門負責生產「*」的工廠

///

class mulfactory : ifactory

}/// /// 專門負責生產「/」的工廠

///

class divfactory : ifactory

}

工廠方法模式是簡單工廠模式的延伸,它繼承了簡單工廠模式的優點,同時還彌補了簡單工廠模式的不足。工廠

方法模式是使用頻率最高的設計模式之一,是很多開源框架和api類庫的核心模式。

優點

(1) 在工廠方法模式中,工廠方法用來建立客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被例項化

這一細節,使用者只需要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名。

(2) 基於工廠角色和產品角色的多型性設計是工廠方法模式的關鍵。它能夠讓工廠可以自主確定建立何種產品

物件,而如何建立這個物件的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多型工廠模式,就正是

因為所有的具體工廠類都具有同一抽象父類。

(3) 使用工廠方法模式的另乙個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的介面,無須

修改客戶端,也無須修改其他的具體工廠和具體產品,而只要新增乙個具體工廠和具體產品就可以了,這樣,系統

的可擴充套件性也就變得非常好,完全符合「開閉原則」。

缺點

(1) 在新增新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對

增加,在一定程度上增加了系統的複雜度,有更多的類需要編譯和執行,會給系統帶來一些額外的開銷。

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

性和理解難度,且在實現時可能需要用到dom、反射等技術,增加了系統的實現難度。

適用場景

(1) 客戶端不知道它所需要的物件的類。在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道

所對應的工廠即可,具體的產品物件由具體工廠類建立,可將具體工廠類的類名儲存在配置檔案或資料庫中。

(2) 抽象工廠類通過其子類來指定建立哪個物件。在工廠方法模式中,對於抽象工廠類只需要提供乙個建立產品

的介面,而由其子類來確定具體要建立的物件,利用物件導向的多型性和黎克特制代換原則,在程式執行時,子類物件

將覆蓋父類物件,從而使得系統更容易擴充套件。

工廠方法模式通過引入工廠等級結構,解決了簡單工廠模式中工廠類職責太重的問題,但由於工廠方法模式中的每個

工廠只生產一類產品,可能會導致系統中存在大量的工廠類,勢必會增加系統的開銷。在工廠模式的基礎上還可以繼

續改進,那便是我們下篇部落格要介紹的抽象工廠。

設計模式 工廠模式 抽象工廠模式

建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...

設計模式 工廠設計模式

用於建立物件的介面,交給子類去實現 我們舉乙個生產nokia的例子 public abstract class nokiaphone先試定義了乙個抽象類,抽象出方法poweronphone 模擬手機開機的動作 public class nokia5200 extends nokiaphone pub...

設計模式 工廠設計模式

工廠模式分為工廠方法模式和抽象工廠模式 工廠方法模式分為 普通工廠模式,就是建立乙個工廠類,對實現了同一介面的一些類進行例項的建立。多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。靜態工廠...