抽象工廠模式之我用
我們關注的內容:
1 使用場景分析
2 案例代碼解析
一 使用場景分析
抽象工廠模式,為創建一組相關或項目依賴的對象提供一個接口,而且無需指定他們具體的類。抽象工廠模式的通用類圖如下:
通俗的來講:擁有共同的屬性和方法體,但是具體的實現內容不同,即可使用抽象工廠模式。
二 案例代碼解析
案例場景:B2C電子商務的支付系統,一個電子商城需要集成不同方式的支付系統,比如支付寶,網銀在線,paypal等,他們共同的特點是需要用戶提供用戶資料,支付完成之后反饋給系統一個狀態或數據。
具體實現圖如下:
先創建一個支付的抽象類AbstractPay:
public abstract class AbstractPay { /// <summary> /// 生成支付鏈接 /// </summary> /// <returns></returns> public abstract string Pay(); /// <summary> /// 支付完成之后對支付結果進行記錄 /// </summary> /// <returns></returns> public abstract string PayResutl(); }
根據支付需求,產生不同實現的支付方式,支付寶實現Zhifubao:
public class Zhifubao:AbstractPay { public override string Pay() { string result = "zhifubao.com"; return result.ToString(); } public override string PayResutl() { return "支付寶成功支付!"; } }
網銀在線實現BankOnLine:
public class BankOnLine : AbstractPay { public override string Pay() { string result = "bankonline.com"; return result.ToString(); } public override string PayResutl() { return "網銀在線成功支付!"; } }
現在開始創建這個工廠,具體代碼如下:
public abstract class PayFactory { public static Zhifubao CreateZhifubao() { return new Zhifubao(); } public static BankOnLine CreateBankOnLine() { return new BankOnLine(); } }
客戶端調用如下:
AbstractPay zfb = PayFactory.CreateZhifubao();
Console.WriteLine(zfb.Pay());
Console.WriteLine(zfb.PayResutl());
AbstractPay oline = PayFactory.CreateBankOnLine();
Console.WriteLine(oline.Pay());
Console.WriteLine(oline.PayResutl());
輸出結果圖:
提升:現在開始思考,如果我新增一個支付方式paypal,該如何做呢?
新增一個paypal類實現:
public class Paypal: AbstractPay { public override string Pay() { string result = "paypal.com"; return result.ToString(); } public override string PayResutl() { return "paypal成功支付!"; } }
下面就要修改工廠才能實現,如何不用修改工廠就能實現呢?可以使用反射的原理來實現。將工廠類修改如下:
public abstract class PayFactory { protected static string myAssemblyName = "FactoryTest"; protected static string Mynamespace = "DesignPattern."; public static AbstractPay CreatePay(string ClassName) { return (AbstractPay)Assembly.Load(myAssemblyName).CreateInstance(Mynamespace + ClassName); } }
客戶端調用如下:
AbstractPay paypal = PayFactory.CreatePay("Paypal");
Console.WriteLine(paypal.Pay());
Console.WriteLine(paypal.PayResutl());
是不是不下次再新增一種支付方式的時候就不用修改工廠類了呢歡迎大家一起探討最佳實現方式!



浙公網安備 33010602011771號