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
C#回顾 - 7.如何使用反射实现工厂模式?的更多相关文章
- java反射机制(工厂模式)
http://www.phpddt.com/dhtml/338.html java里面没有typeof,js有. 我终于实现了用反射机制编写的工厂模式.java反射在工厂模式可以体现. 包含产品接口类 ...
- IOC的实现原理—反射与工厂模式的结合
反射机制概念 我们考虑一个场景,如果我们在程序运行时,一个对象想要检视自己所拥有的成员属性,该如何操作?再考虑另一个场景,如果我们想要在运行期获得某个类的Class信息如它的属性.构造方法.一般方 ...
- java学习笔记之反射—反射和工厂模式
简单工厂模式又称为静态工厂方法模式,它是由工厂对象来决定要创建哪一种类的实例化对象. 静态工厂代码: class Factory{ private Factory() {} public static ...
- Java反射+简单工厂模式总结
除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...
- C# 反射+抽象工厂模式
此模式可以很好的更换程序使用不同的数据库 1.用到的属性类 using System; using System.Collections.Generic; using System.Linq; usi ...
- java 反射的应用 以及通过反射 用到的工厂模式
java反射详解 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案 ...
- Java反射机制在工厂模式中的应用
在本篇文章中就不详细介绍工厂模式,主要介绍一下反射在工厂模式中的使用,让读者对反射机制带来的好处有更深的认识. 首先看一下简单工厂模式 简单工厂模式(simple factory)是类的创建模式,又叫 ...
- 反射 + 抽象工厂模式切换DB数据源(附Demo)
首先,设计模式的文章源自于程杰的<大话设计模式>这本书,这本书个人感觉很适合我,看着不累,能够安安心心的阅读学习.在这里十分感谢程杰的这本书,我博文中的例子会根据书上的例子来.为了不侵犯这 ...
- java 设计模式之工厂模式与反射的结合
工厂模式: /** * @author Rollen-Holt 设计模式之 工厂模式 */ interface fruit{ public abstract void eat(); } ...
随机推荐
- RGW 负载均衡和高可用的几个方案对比
注:在RGW网关主机网卡已经是10Gb的情况下,如下三个方案没有引入LVS:如果RGW是Gb网卡,可以考虑引入LVS做流量负载均衡. RGW部署采用 fastcgi+nginx 扩展性和可配置性更强. ...
- SetEnvlfNoCase 记录从自己网站之外传来的请求
<FilesMatch \.(jpg|gif|png)$> SetEnvIfNoCase Referer "^http://www.example.com/" loca ...
- Charles 从入门到精通
特别说明:原文来自唐巧大神的博客 http://blog.devtang.com/2015/11/14/charles-introduction/ Charles 从入门到精通 文章目录 1. 目录及 ...
- iOS小知识点(非UI部分)
1. _cmd 表示当前方法的@SEL指针, - (void)putString{} 对于这个函数_cmd 等效于@selector(putString)
- 用java下载hdfs文件报NullPointerException
用fs.copyToLocalFile( hdfsPath,localPath);下载hdfs的文件会报NullPointerException,具体报错为: java.lang.NullPointe ...
- Finite State Machine 是什么?
状态机(Finite State Machine):状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动 作.完成特定操作的控制中心. 类 ...
- 对前端的一个H5项目的所思所想
最近接触一个前端HTML5的项目,虽然我主做iOS,但曾经也徒手用html+css+js+php写过一个博客,当然表示无压力了.结果.现在的前端发展的速度真是快啊,项目中用到Jquery,reactJ ...
- U盘因为装linux系统变小了
U盘在Windows下被UltraISO等软件制作成Linux启动盘后会自动被格式化成FAT格式,导致容量变小. 用DiskGenius去修复 http://www.jb51.net/softs/75 ...
- Java核心思想
回忆面向对象思想 面向对象,主页君也不敢对其多说什么,毕竟这是一个看似简单,但是其实蕴含很深层次理 论的东西,并不是看书就可以理解的,其实也是要在很多实际操作中学习,积累. ...
- jquery 幻灯片 左右滚动
使用jquery封装的一个幻灯片插件 写的好差 参考了别人写的 后面再重构 现在这个应该可以直接用了 主要实现思路就是 添加当前选中状态 index相对应的 选中的图总是在第一位(也就是加选中状态的 ...