前言
所謂簡單工廠,工廠,抽象工廠。當我一開始看到並學習這個這三個概念的時候就感覺這三個感念很相似,有點混亂,事實證明,確實讓我變得很混亂。即使當初學的時候勉強看懂,但是事後便拋諸腦後,統統忘記到九霄雲外了。
因此當我回過頭從新理解概念時,總結了以下心得,加深理解,並且做一個備忘錄。
工廠類模式設計的核心是:讓“生產”和“產品”解耦。
簡單工廠
所謂的簡單工廠,我的理解是不用管是什麼產品,我們將所有產品的生產線一股腦的都放在一個工廠裏,這樣工廠便可以根據用戶的要求來生產各種產品。
代碼如下:
int prodNo;
public SimpleFactory(int prodNo) //構造工廠時告知工廠產品標識
{
this.prodNo = prodNo;
}
public IProduct GetProduct()
{
switch (prodNo) //根據產品標識生產產品
{
default:
return new ProductA();
case 1:
return new ProductA();
case 2:
return new ProductB();
}
}
}
//產品A
class ProductA: IProduct
{
//產品屬性
//......
}
//產品B
class ProductB : IProduct
{
//產品屬性
//......
}
//產品接口
interface IProduct
{
//產品方法
//......
}
由此我們可以看出簡單工廠模式的缺陷就是,由於一個工廠裏生產所有的商品,當出現新的產品時,我們需要擴展改造工廠以適應新產品的生產,這樣使得“生產”和“產品”並沒有解耦,並且會導致工廠無限制的擴大,難以檢查維護。
工廠
基於簡單工廠的缺陷,我們使用工廠模式,工廠模式就是一個工廠只生產一樣產品,當需要新產品時,我們只用設計新產品和建設新工廠就行了。這樣的方式使得原來的產品生產線不受新產品的影響實現瞭解耦。
代碼如下:
interface IFactory //工廠接口
{
IProduct GetProduct();
}
//A工廠類
public class FactoryA: IFactory
{
IProduct productA;
public FactoryA()
{
this.productA = new ProductA();
}
public IProduct GetProduct() //A工廠生產A產品
{
return this.productA;
}
}
//B工廠類
public class FactoryB : IFactory
{
IProduct productB;
public FactoryB()
{
this.productB = new ProductB();
}
public IProduct GetProduct() //B工廠生產B產品
{
return this.productB;
}
}
//產品接口
public interface IProduct
{
//產品方法
//......
}
//產品A
public class ProductA : IProduct
{
//產品屬性
//......
}
//產品B
public class ProductB : IProduct
{
//產品屬性
//......
}
抽象工廠
抽象工廠是基於工廠模式的,由上可知,工廠類只有單一的抽象產品,但是如果一個工廠可以產生多個產品,而每個產品又可以被多個工廠生產時,這時工廠模式便不能滿足我們的設計需求了。因此,我們引出抽象工廠。
舉個例子:比如三星是一個品牌,三星生產洗衣機,電視,冰箱;格力也是一個品牌,格力也生產洗衣機,電視,冰箱。那麼,三星工廠和格力工廠生產的2個品牌的洗衣機,同時洗衣機這種產品還可以被LG,海爾,三菱等等不同的品牌的工廠生產。那麼三星生產的三星洗衣機,三星電視機,三星冰箱就是三星這個工廠所能生產的產品。可能還會有西門子工廠產品,格力工廠產品,美的工廠產品等等。
代碼如下:
//工廠接口,即抽象工廠
interface IFactory
{
IFridge CreateFridge();
IAirCondition CreateAirCondition();
}
//三星的工廠,生產三星的產品族
public class SamsungFactory : IFactory
{
public IAirCondition CreateAirCondition()
{
return new SamsungAirCondition(); //三星的工廠生產三星的空調
}
public IFridge CreateFridge()
{
return new SamsungFridge(); //三星的工廠生產三星的冰箱
}
}
//格力的工廠,生產格力的產品族
public class GreeFactry : IFactory
{
public IAirCondition CreateAirCondition()
{
return new GreeAirCondition(); //格力的工廠生產格力的空調
}
public IFridge CreateFridge()
{
return new GreeFridge(); //格力的工廠生產格力的冰箱
}
}
//冰箱產品接口
public interface IFridge
{
//冰箱產品接口
//冰箱的action
}
//空調接口
public interface IAirCondition
{
//空調產品接口
//空調的action
}
//三星的冰箱
public class SamsungFridge: IFridge
{
//三星冰箱的action和property
}
//格力的冰箱
public class GreeFridge : IFridge
{
//格力冰箱的action和property
}
//三星的空調
public class SamsungAirCondition : IAirCondition
{
//三星空調的action和property
}
//格力的空調
public class GreeAirCondition : IAirCondition
{
//格力空調的action和property
}
我們可以得出結論:
1.工廠模式中,一個工廠生產一個產品,所有產品派生於同一個抽象產品(或產品接口)。
2.抽象工廠中,每個工廠都可以生產多個產品,它們是一個品牌。而不同的產品繼承自不同的抽象產品接口。
總結
對於我自己的項目而言,確實使用到了簡單工廠模式,所以我覺得簡單工廠模式確實是一個非常好用的方法去生產自己所需要的類。同時,對於C++而言,沒有java的接口概念,所以我們可以定義純虛函數,此時的類便是抽象基類,純虛函數便是接口。我們可以這樣來實現抽象產品和抽象工廠在C++中的應用,因爲接口是規範類行爲的。