工廠模式
工廠模式屬於建立型模式,大致可以分為三類,簡單工廠模式、工廠方法模式、抽象工廠模式。
例如部署多種資料庫的情況,可能在不同的地方要使用不同的資料庫,此時只需要在配置檔案中設定資料庫的型別,每次再根據型別生成例項,這樣,不管下 面的資料庫型別怎麼變化,在客戶端看來都是只有乙個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 usingnamespace
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 usingnamespace
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 工廠模式
介面行模式 職責型模式 構造型模式 不通過類建構函式來建立物件,使用特定的模式來為客戶類建立例項物件 操作型模式 擴充套件型模式 在建立類時,通常可以同時定義多個建構函式來建立這個類的例項。然而有些時候,客戶 雖然需要某個物件,但是卻不關心這個物件究竟是由哪個類建立而來。工廠模式的意圖是定義乙個用於...