設(shè)計(jì)模式培訓(xùn)之三:抽象工廠
查看本人文章索引請(qǐng)通過(guò)http://www.rzrgm.cn/seesea125/archive/2012/04/17/2453256.html
在工廠方法里講到了加減乘除的例子,請(qǐng)查閱http://www.rzrgm.cn/seesea125/archive/2012/05/02/2478981.html
一、抽象工廠的定義
提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)須指定它們的具體類。
二、實(shí)現(xiàn)思路
實(shí)現(xiàn)思路:如果說(shuō)簡(jiǎn)單工廠與工廠方法是對(duì)同一個(gè)問(wèn)題的兩種不同的解決方法的話,抽象工廠就是解決一系列這種問(wèn)題的方法。因?yàn)槠渲饕淖饔镁褪巧a(chǎn)一系列相互依賴的對(duì)象,而不用去關(guān)心它們具體的實(shí)現(xiàn)。
三、代碼實(shí)現(xiàn)
為了方便查看工廠方法和抽象工廠的區(qū)別,因此還以工廠方法的例子為例,做進(jìn)一步擴(kuò)展。
在工廠方法里,工廠方法的核心代碼如下:
public interface IFactory { Operation Create(); } public class AddOperation : IFactory { public Operation Create() { return new OperationAdd(); } } public class SubOperation : IFactory { public Operation Create() { return new OperationSub(); } } public abstract class Operation { public double NumA { get; set; } public double NumB { get; set; } public abstract double GetResult(); } public class OperationAdd : Operation { public override double GetResult() { return NumA + NumB; } } public class OperationSub : Operation { public override double GetResult() { return NumA - NumB; } }
假設(shè)這個(gè)加減運(yùn)算是中國(guó)人的運(yùn)算方法,美國(guó)人加減運(yùn)算不是這么算的,比如美國(guó)人的加法,是NumA + NumB+10,美國(guó)人的減法是NumA - NumB-10,呵呵,這只是假設(shè),目的是方便我們看工廠方法和抽象工廠的區(qū)別,當(dāng)然現(xiàn)實(shí)中不可能發(fā)生。
為了區(qū)分,我們把OperationAdd,OperationSub 分別改為ChinaOperationAdd,ChinaOperationSub,同時(shí)實(shí)現(xiàn)美國(guó)人的加法和減法AmericaOperationAdd,AmericaOperationSub,這兩個(gè)方法也同樣繼承自O(shè)peration,代碼如下:
public abstract class Operation { public double NumA { get; set; } public double NumB { get; set; } public abstract double GetResult(); } public class ChinaOperationAdd : Operation { public override double GetResult() { return NumA + NumB; } } public class ChinaOperationSub : Operation { public override double GetResult() { return NumA - NumB; } } public class AmericaOperationAdd : Operation { public override double GetResult() { return NumA + NumB+10; } } public class AmericaOperationSub : Operation { public override double GetResult() { return NumA - NumB-10; } }
接下來(lái)我們把AddOperation 和SubOperation 這兩個(gè)繼承自IFactory的類,給改造一下,定義一個(gè)新的類ChinaOperationFactroy,這個(gè)新類里返回兩個(gè)操作,分別是AddOperation,SubOperation,代碼如下:
public class ChinaOperationFactroy { public Operation AddOperation() { return new ChinaOperationAdd(); } public Operation SubOperation() { return new ChinaOperationSub(); } }
再建一個(gè)美國(guó)的工廠,也是返回美國(guó)的加法和減法的實(shí)例,代碼如下:
public class AmericaOperationFactroy { public Operation AddOperation() { return new AmericaOperationAdd(); } public Operation SubOperation() { return new AmericaOperationSub(); } }
到現(xiàn)在為止,ChinaOperationFactroy,AmericaOperationFactroy的代碼很相似,他們都是返回了AddOperation和SubOperation方法,因此把他們抽象出來(lái),建議一個(gè)抽象工廠
public abstract class AbstractFactory { public static AbstractFactory GetInstance() { AbstractFactory instance = new AmericaOperationFactroy(); return instance; } public abstract Operation AddOperation(); public abstract Operation SubOperation(); }
然后讓ChinaOperationFactroy和AmericaOperationFactroy繼承這個(gè)工廠,改進(jìn)后代碼如下
public class ChinaOperationFactroy : AbstractFactory { public override Operation AddOperation() { return new ChinaOperationAdd(); } public override Operation SubOperation() { return new ChinaOperationSub(); } } public class AmericaOperationFactroy : AbstractFactory { public override Operation AddOperation() { return new AmericaOperationAdd(); } public override Operation SubOperation() { return new AmericaOperationSub(); } }
此時(shí)抽象工廠已經(jīng)完成了,客戶端調(diào)用
AbstractFactory af = AbstractFactory.GetInstance(); Operation oper = af.AddOperation(); oper.NumA = 3; oper.NumB = 2; double result = oper.GetResult(); Response.Write(result);
這個(gè)時(shí)候如果我們想調(diào)用中國(guó)的加法和減法,只需要把抽象地方改下,改動(dòng)一個(gè)標(biāo)紅的地方即可,改動(dòng)后,加法和減法運(yùn)算都變成中國(guó)的了
public abstract class AbstractFactory { public static AbstractFactory GetInstance() { AbstractFactory instance = new ChinaOperationFactroy(); return instance; } public abstract Operation AddOperation(); public abstract Operation SubOperation(); }
這種改動(dòng)可以通過(guò)反射來(lái)搞定它,這樣就只需要修改配置文件就可以了,反射在工廠方法里已經(jīng)介紹,就不再多寫了。
四、工廠與抽象工廠的對(duì)比
由代碼也可以看出,抽象工廠解決的是創(chuàng) 建一系列有共同風(fēng)格的產(chǎn)品(魯菜還是粵菜),而工廠方法模式解決的創(chuàng)建有共同特征的一系列產(chǎn)品(紅燒肉、清蒸魚它們都是食物)。


浙公網(wǎng)安備 33010602011771號(hào)