抽象工厂模式之我用
我们关注的内容:
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());
是不是不下次再新增一种支付方式的时候就不用修改工厂类了呢
欢迎大家一起探讨最佳实现方式!
分类:
设计模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架