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(); } ...
随机推荐
- 纯CSS实现图片水平垂直居中于DIV(图片未知宽高)
<div class="demo"><a href="#"><img src="http://nec.netease.c ...
- [转]win 10 开始菜单(Win 7风格)增强工具 StartIsBack++ v1.3.4 简体中文特别版
Windows10开始菜单增强工具StartIsBack++现已更新至v1.3.4,最近主要修复在Win10周年更新版上恢复睡眠后任务栏通知中心按钮消失的问题.升级版对StartIsBack+全新构建 ...
- JS 验证数组中是否包含重复元素
验证JS中是否包含重复元素,有重复返回true:否则返回false 方案一. function isRepeat(data) { var hash = {}; for (var i in data) ...
- 对于angularJS的一点思考
已经找好工作近两周了,入职基本上还算顺利,自己两年来的挑灯夜战也算是有了收获,于是这两周基本上是按部就班的工作,没有学习什么新技术.在上个公司的时候,同事在项目中使用angularJs,之前他也没有接 ...
- NodeJs + mongodb模块demo
代码比较通俗易懂,但是我还是在这个过程中浪费了不少时间,也算是看到了nodejs中异步的一个小坑.未来的坑还有很多,慢慢找坑填坑吧. 参考资料如下: 1.断言模块 : https://nodejs.o ...
- BZOJ1598: [Usaco2008 Mar]牛跑步
传送门 K短路,普遍的算法是采用AStar求解,先建立反向边跑一遍dij,或者spfa什么的.跑出反向边的距离就可以看为估价函数中的$h()$.设$dist$为当前已经走过的距离,那么$f(node) ...
- <<< php程序在运行后报“internal server error”错误
上传的php程序在运行后报“internal server error”错误,检查以下两方面: 1.请您检查php程序的属性是否设置为755,如果php程序的属性不是755,那么运行的时候会报“int ...
- php多文件压缩下载
/*php多文件压缩并且下载*/ function addFileToZip($path,$zip){ $handler=opendir($path); //打开当前文件夹由$path指定. whil ...
- Google 地图 API V3 之 叠加层
Google官方教程: Google 地图 API V3 使用入门 Google 地图 API V3 针对移动设备进行开发 Google 地图 API V3 之事件 Google 地图 API V3 ...
- Bootstrap学习笔记
Bootstrap提供了一套响应式.移动设备优先的流式栅格系统. Bootstrap把一个容器或整个网页平均分成了12列. 栅格系统必须放在.container或container-fluid中 样式 ...