C#回顾 - 7.如何使用反射实现工厂模式?
工厂模式是一种比较常用的设计模式,其基本思想在于使用不同的工厂类型来打造不同产品的部件。例如,我们在打造一间屋子时,可能需要窗户、屋顶、门、房梁、柱子等零部件。有的屋子需要很多根柱子,而有的屋子又不需要窗户。在这样的需求下,就可以使用工厂模式。
(1)工厂模式的传统实现和其弊端#
下图展示了针对屋子设计的传统工厂模式架构图:
上图的设计思路是:
①使用者告诉工厂管理者需要哪个产品部件;
②工厂管理者分析使用者传入的信息,生成合适的实现工厂接口的类型对象;
③通过工厂生产出相应的产品,返回给使用者一个实现了该产品接口的类型对象;
通过上述思路,实现代码如下:
①首先是定义工厂接口,产品接口与产品类型的枚举
IFactory.cs(工厂接口,产品接口一起
)
|
②其次是具体实现产品接口的产品类:窗户、屋顶和柱子
Product.cs
|
③然后是具体实现工厂接口的工厂类:实现接口返回一个具体的产品对象
Factory.cs
|
④最后是工厂管理类:组织起众多的产品与工厂
FactoryManager.cs
|
按照国际惯例,我们实现一个入口方法来测试一下:
Client.cs
|
①工厂管理类和工厂类族耦合;
②每次添加新的零件都需要添加一对工厂类和产品类,类型会越来越多;
(2)基于反射的工厂模式的实现#
利用反射机制可以实现更加灵活的工厂模式,这一点体现在利用反射可以动态地获知一个产品由哪些零部件组成,而不再需要用一个switch语句来逐一地寻找合适的工厂。
①产品、枚举和以上一致,这里的改变主要在于添加了两个自定义的特性,这两个特性会被分别附加在产品类型和产品接口上:ProductAttribute.cs
|
②下面是产品接口和产品类族的定义,其中产品接口使用了 ProductListAttribute 特性,而每个产品都使用了 ProductAttribute 特性:
|
③下面是修改后的工厂类,由于使用了反射特性,这里一个工厂类型就可以生产所有的产品:
Factory.cs
|
④最后时修改后的工厂管理类,核心只有三行代码:
FactoryManager.cs
|
- /// <summary>
- /// 屋子产品的零件
- /// </summary>
- public enum RoomParts
- {
- Roof,
- Window,
- Pillar,
- Floor //地板
- }
- /// <summary>
- /// 地板
- /// </summary>
- [Product(RoomParts.Floor)]
- public class Floor : IProduct
- {
- // 实现接口,返回产品名字
- public string GetName()
- {
- return "地板";
- }
- }
- /// <summary>
- /// 产品接口
- /// </summary>
- [ProductList(new Type[] { typeof(Roof), typeof(Window), typeof(Pillar), typeof(Floor) })]
- public interface IProduct
- {
- string GetName();
- }
作者:周旭龙
出处:http://www.cnblogs.com/edisonchou/p/4827578.html
作者:【唐】三三
出处:https://www.cnblogs.com/tangge/p/6109820.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2011-11-28 VS2010安装中文版MSDN文档方法