設計模式 (1)工廠模式

2022-03-13 04:10:53 字數 3469 閱讀 3893

工廠模式

工廠模式屬於建立型模式,大致可以分為三類,簡單工廠模式、工廠方法模式、抽象工廠模式。

例如部署多種資料庫的情況,可能在不同的地方要使用不同的資料庫,此時只需要在配置檔案中設定資料庫的型別,每次再根據型別生成例項,這樣,不管下 面的資料庫型別怎麼變化,在客戶端看來都是只有乙個abstractproduct,使用的時候根本無需修改**。提供的型別也可以用比較便於識別的字元 串,這樣不用記很長的類名,還可以儲存為配置檔案。

這樣,每次只需要修改配置檔案和新增新的產品子類即可。

所以簡單工廠模式一般應用於多種同型別類的情況,將這些類隱藏起來,再提供統一的介面,便於維護和修改。

1.隱藏了物件建立的細節,將產品的例項化推遲到子類中實現。

2.客戶端基本不用關心使用的是哪個產品,只需要知道用哪個工廠就行了,提供的型別也可以用比較便於識別的字串。

3.方便新增新的產品子類,每次只需要修改工廠類傳遞的型別值就行了。

4.遵循了依賴倒轉原則。

1.要求產品子類的型別差不多,使用的方法名都相同,如果模擬較多,而所有的類又必須要新增一種方法,則會是非常麻煩的事情。或者是一種類另一種類有幾種方法不相同,客戶端無法知道是哪乙個產品子類,也就無法呼叫這幾個不相同的方法。

2.每新增乙個產品子類,都必須在工廠類中新增乙個判斷分支,這違背了開放-封閉原則。

簡單工廠模式

簡單工廠模式,它的主要特點是需要在工廠類中做判斷,從而創造相應的產品。當增加新的產品時,就需要修改工廠類。

例如:有一家生產處理器核的廠家,它只有乙個工廠,能夠生產兩種型號的處理器核。客戶需要什麼樣的處理器核,一定要顯示地告訴生產工廠。下面給出一種實現方案。

//簡單工廠模式

#include using

namespace

std;

enum ctype ; 

//抽象產品

class

abstractproduct;//

具體產品1

class concreteproduct1: public

abstractproduct

};//

具體產品2

class concreteproduct2: public

abstractproduct

};//

具體的工廠(沒有抽象工廠),,可以生產兩種產品,在內部判斷

class

concretefactory

else

if(ctype

== product_b

)

else

}};int

main()

這樣設計的主要缺點就是要增加新的產品時,就需要修改工廠類。這就違反了開放封閉原則:軟體實體(類、模組、函式)可以擴充套件,但是不可修改。於是,工廠方法模式出現了。

工廠方法模式

工廠方法模式,是指定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。factory method使乙個類的例項化延遲到其子類。

這家生產處理器核的產家賺了不少錢,於是決定再開設乙個工廠專門用來生產b型號的單核,而 原來的工廠專門用來生產a型號的單核。這時,客戶要做的是找好工廠,比如要a型號的核,就找a工廠要;否則找b工廠要,不再需要告訴工廠具體要什麼型號的 處理器核了。下面給出乙個實現方案。

#include using

namespace

std;

//普通工廠模式

//抽象產品

class

abstractproduct;//

具體產品1

class concreteproduct1: public

abstractproduct

};//

具體產品2

class concreteproduct2: public

abstractproduct

};//

抽象工廠

class

abstractfactory;//

具體工廠1

class concretefactory1: public

abstractfactory

};//

具體工廠2

class concretefactory2: public

abstractfactory

};int

main()

工廠方法模式也有缺點,每增加一種產品,就需要增加乙個物件的工廠。如果這家公司發展迅速,推出了很多新的產品,那麼就要開設相應的新工廠。在c++實現中,就是要定義乙個個的工廠類。顯然,相比簡單工廠模式,工廠方法模式需要更多的類定義。

抽象工廠模式

抽象工廠模式,為提供乙個建立一系列相關或相互依賴物件的介面,而需指定它們具體的類。

這家公司的技術不斷進步,不僅可以生產單核處理器,也能生產多核處理器。現在簡單工廠模式和工廠方法模式都鞭長莫及。抽象工廠模式登場了。這家公司還是開設兩個工廠,乙個專門用來生產a型號的單核多核處理器,而另乙個工廠專門用來生產b型號的單核多核處理器,下面給出實現的**。

#include using

namespace

std;

//抽象工廠模式

//抽象產品a

class

abstractproducta;//

具體產品a1

class concreteproducta1: public

abstractproducta

};//

具體產品a2

class concreteproducta2: public

abstractproducta

};//

抽象產品b

class

abstractproductb;//

具體產品b1

class concreteproductb1: public

abstractproductb

};//

具體產品b2

class concreteproductb2: public

abstractproductb

};//

抽象工廠

class

abstractfactory;//

具體工廠1

class concretefactory1: public

abstractfactory

abstractproductb*getproductb()

}; //具體工廠2

class concretefactory2: public

abstractfactory

abstractproductb*getproductb()

};int

main()

至此,三種模式介紹完畢。

參考:

設計模式 1 工廠模式

本篇部落格主要是總結一下自己對工廠模式的認識,例子可能不太恰當,uml類圖也可能線用錯。不過思想還是正確的 望各位指出錯誤 簡單工廠模式嚴格意義上不屬於設計模式 2.1 抽象產品角色 是具體產品角色的共同父類,提供了乙個標準介面。e.g 將計算機專業看成乙個抽象產品角色 public abstrac...

設計模式 工廠模式 1

2.工廠方法模式 3.抽象工廠模式 public inte ce fruit public class banana implements fruit public class implements fruit public class fruitfactory public static frui...

設計模式 1 工廠模式

介面行模式 職責型模式 構造型模式 不通過類建構函式來建立物件,使用特定的模式來為客戶類建立例項物件 操作型模式 擴充套件型模式 在建立類時,通常可以同時定義多個建構函式來建立這個類的例項。然而有些時候,客戶 雖然需要某個物件,但是卻不關心這個物件究竟是由哪個類建立而來。工廠模式的意圖是定義乙個用於...