定義(工廠模式又稱工廠方法模式)
工廠方法模式:定義一個用于創(chuàng)建對象的接口巫俺,讓子類決定實(shí)例化哪一個類俱诸。工廠方法模式是以一個類的實(shí)例化延遲到其子類馅巷。
Factory Method模式用于在不指定待創(chuàng)建對象的具體類的情況下創(chuàng)建對象急前。
Factory Method模式的主要意圖是隱藏對象創(chuàng)建的復(fù)雜性狈网。Client通常不指定要創(chuàng)建的具體類礼搁,Client將面向接口或抽象類進(jìn)行編碼饶碘,讓Factory類負(fù)責(zé)創(chuàng)建具體的類型。通常Factory類有一個返回抽象類或者接口的靜態(tài)方法馒吴。Client通常提供某種信息讓Factory類使用提供的信息來確定創(chuàng)建并返回哪個子類扎运。
將創(chuàng)建子類的責(zé)任抽象出來的好處是允許Client完全無需考慮依賴類是如何創(chuàng)建的瑟曲,這遵守依賴倒置原則(Dependency Inversion Principle,DIP)豪治。Factory Method模式另外一個好處是把負(fù)責(zé)對象創(chuàng)建的代碼集中起來洞拨,如果需要修改對象生成方式,可以輕松定位并更新负拟,而不會影響到依賴它的代碼烦衣。
在面向?qū)ο缶幊讨校话惴椒ㄊ怯靡粋€new操作符產(chǎn)生一個對象的實(shí)例掩浙。但是在一些情況下花吟,用new操作符直接生成對象會帶來一些問題。首先涣脚,要使用new運(yùn)算符創(chuàng)建一個對象必須清楚所要創(chuàng)建的對象的類信息示辈,包括類名、構(gòu)造函數(shù)等遣蚀,而有時并不現(xiàn)實(shí)矾麻。其次許多類型的對象創(chuàng)建需要一系列的步驟,可能需要計(jì)算或取得對象的初始設(shè)置芭梯,選擇生成那個子對象實(shí)例险耀,或在生成需要的對象之前必須生成一些輔助功能的對象。在這些情況下玖喘,新對象的建立就是一個過程甩牺,而不是一個簡單的操作。為輕松方便地完成復(fù)雜對象的創(chuàng)建累奈,從而引入了工廠模式贬派。
C#例子
public abstract class Product
{
public abstract string GetName();
}
public class ProductA : Product
{
public override string GetName()
{
return "我是A產(chǎn)品!";
}
}
public class ProductB:Product
{
public override string GetName()
{
return "我是B產(chǎn)品澎媒!";
}
}
public abstract class Factory
{
public abstract Product CreateProduct();
}
public class FactoryA : Factory
{
public override Product CreateProduct()
{
return new ProductA();
}
}
public class FactoryB : Factory
{
public override Product CreateProduct()
{
return new ProductB();
}
}
class Program
{
static void Main(string[] args)
{
Factory[] factories = new Factory[2];
factories[0] = new FactoryA();
factories[1] = new FactoryB();
foreach (var factory in factories)
{
Product product = factory.CreateProduct();
Console.WriteLine(product.GetName());
}
Console.ReadLine();
}
}
工廠方法模式參與者:
- Product:Product角色搞乏,定義工廠方法所創(chuàng)建的對象的接口
- Product*:具體Product角色,實(shí)現(xiàn)Product接口
- Factory:抽象的工廠角色戒努,聲明工廠方法请敦,該方法返回一個Product類型的對象。
Factory可以定義一個工廠方法的默認(rèn)實(shí)現(xiàn)储玫,返回一個默認(rèn)的Product對象侍筛。可以調(diào)用工廠方法以創(chuàng)建一個Product對象撒穷。 - Factory*:具體的工廠角色匣椰,創(chuàng)建具體Product的子工廠,重寫工廠方法以返回一個Product實(shí)例
工廠方法模式適用情形
- 當(dāng)一個類不知道它所必須創(chuàng)建的對象的類信息的時候
- 當(dāng)一個類希望由它來指定它所創(chuàng)建的對象的時候
- 當(dāng)類將創(chuàng)建對象的職責(zé)委托給多個輔助子類中的某一個端礼,并且希望將哪一個輔助之類是代理者這一信息局部化的時候
工廠方法模式特點(diǎn)
- 使用工廠方法在一個類的內(nèi)部創(chuàng)建對象通常比直接創(chuàng)建對象更靈活
- 工廠方法模式通過面向?qū)ο蟮氖址ㄎ炎Γ瑢⑺獎?chuàng)建的具體對象的創(chuàng)建工作延遲到子類弛车,從而提供了一種擴(kuò)展的策略齐媒,較好的解決了緊耦合的關(guān)系
- 工廠方法模式遵守依賴倒置原則(Dependency Inversion Principle蒲每,DIP)
其他
工廠方法模式與簡單工廠模式區(qū)別
- 工廠方法模式和簡單工廠模式在結(jié)構(gòu)上的不同是很明顯的。工廠方法模式的核心是一個抽象工廠類喻括,而簡單工廠模式把核心放在一個具體工廠類上邀杏。工廠方法模式可以允許很多具體工廠類從抽象工廠類中將創(chuàng)建行為繼承下來,從而可以成為多個簡單工廠模式的綜合唬血,進(jìn)而推廣了簡單工廠模式望蜡。
- 工廠方法模式退化后可以變得很像簡單工廠模式。如果非常確定一個系統(tǒng)只需要一個具體工廠類拷恨,那么就不妨把抽象工廠類合并到具體的工廠類中去脖律。由于只有一個具體工廠類,所以不妨將工廠方法改成為靜態(tài)方法腕侄,這時候就得到了簡單工廠模式
/// <summary>
/// 簡單工廠小泉,和工廠模式對比用
/// </summary>
public class EasyFactory
{
// 簡單工廠,根據(jù)字符串創(chuàng)建相應(yīng)的對象
public static Product CreateProduct(String name)
{
switch (name)
{
case "A":
return new ProductA();
case "B":
return new ProductB();
default:
throw new Exception("產(chǎn)品不存在冕杠!");
}
}
}
源碼地址
其他設(shè)計(jì)模式