需求:工厂类根据参数生成对应类的实例。

示例:

RoomParts.cs

namespace ReflectionFactory
{/// <summary>/// 屋子产品的零件/// </summary>public enum RoomParts{Roof,Window,Pillar}
}

ProductAttribute.cs

using System;namespace ReflectionFactory
{/// <summary>/// 这个特性用来附加在产品类型之上,/// 来标注该类型代表哪个产品,方便反射使用/// </summary>public class ProductAttribute : Attribute{/// <summary>/// 标注零件的成员/// </summary>private RoomParts _myRoomPart;public ProductAttribute(RoomParts part){_myRoomPart = part;}public RoomParts RoomPart{get{return _myRoomPart;}}}
}

ProductListAttribute.cs

using System;namespace ReflectionFactory
{/// <summary>/// 这个特性用来附加在产品接口之上/// 用来标注一共实现了多少产品零件,方便反射使用/// </summary>public class ProductListAttribute : Attribute{/// <summary>/// 产品类型集合/// </summary>private Type[] _myList;public ProductListAttribute(Type[] products){_myList = products;}public Type[] ProductList{get{return _myList;}}}
}

IProduct.cs

using System;namespace ReflectionFactory
{/// <summary>/// 产品零件接口,/// 需要添加所有实现该接口的列表/// </summary>[ProductList(new Type[] { typeof(Roof), typeof(Window), typeof(Pillar) })]public interface IProduct{string GetName();}
}

Roof.cs

namespace ReflectionFactory
{/// <summary>/// 屋顶类型/// </summary>
    [Product(RoomParts.Roof)]public class Roof : IProduct{public string GetName(){return "屋顶";}}
}

Window.cs

namespace ReflectionFactory
{/// <summary>/// 窗户类型/// </summary>
    [Product(RoomParts.Window)]public class Window : IProduct{public string GetName(){return "窗户";}}
}

Pillar.cs

namespace ReflectionFactory
{/// <summary>/// 柱子类型/// </summary>
    [Product(RoomParts.Pillar)]public class Pillar : IProduct{public string GetName(){return "柱子";}}
}

IFactory.cs

namespace ReflectionFactory
{public interface IFactory{IProduct Produce(RoomParts part);}
}

Factory.cs

using System;
using System.Reflection;namespace ReflectionFactory
{/// <summary>/// 工厂类型/// </summary>public class Factory : IFactory{public IProduct Produce(RoomParts part){// 通过反射,从IProduct接口获得属性// 从而获得所有的产品零件列表ProductListAttribute attr = Attribute.GetCustomAttribute(typeof(IProduct), typeof(ProductListAttribute)) as ProductListAttribute;// 遍历所有的实现产品零件类型foreach (Type type in attr.ProductList){// 利用发射查找其属性ProductAttribute pa = Attribute.GetCustomAttribute(type, typeof(ProductAttribute)) as ProductAttribute;// 确定是否是需要的零件if (pa.RoomPart == part){// 利用反射创建产品零件类型Object product = Assembly.GetExecutingAssembly().CreateInstance(type.FullName);return product as IProduct;}}return null;}}
}

FactoryManager.cs

using System;namespace ReflectionFactory
{/// <summary>/// 工厂管理类型/// </summary>public class FactoryManager{public static IProduct GetProduct(RoomParts part){// 一共只有一个工厂,不再需要根据产品类型而挑选工厂Factory factory = new Factory();IProduct product = factory.Produce(part);Console.WriteLine("生产了一个产品:" + product.GetName());return product;}}
}

Program.cs

using System;namespace ReflectionFactory
{class Program{static void Main(string[] args){// output : 生产了一个产品:柱子IProduct pillar = FactoryManager.GetProduct(RoomParts.Pillar);// output : 生产了一个产品:屋顶IProduct roof = FactoryManager.GetProduct(RoomParts.Roof);// output : 生产了一个产品:窗户IProduct window = FactoryManager.GetProduct(RoomParts.Window);Console.Read();}}
}

转载于:https://www.cnblogs.com/Ryukaka/p/5161876.html

利用反射实现工厂模式相关推荐

  1. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细

    1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...

  2. Java的反射机制 工厂模式综合讲解【转载自51CTO】

    2019独角兽企业重金招聘Python工程师标准>>> Java的反射机制 工厂模式综合讲解 1.什么叫反射 Java.lang.reflect包下 正常情况下我们可以通过类实例化一 ...

  3. C#三层架构第九课之反射和工厂模式实现多数据库访问

    反射和工厂模式实现不同数据库访问 在之前上课的基础上,使用反射和模唱模式,实现针对不同数据库的动态访问. 在之前的三层架构代码基础上进行修改. 使用三层架构+工厂模式,来实现一个程序访问多个数据库. ...

  4. 反射与工厂模式:早餐店的发展之路

    实际开发中,接口的主要作用是为了不用层提供有一个操作的标准,如果直接实例化了类的操作[用new关键字来实例化],则一定存在耦合问题,可以用工厂模式解决此问题. 接下来用一个店主开早餐店的经历来阐述反射 ...

  5. java 反射实现 工厂模式_java – 用反射实现工厂模式

    我正在实施工厂模式这是我的工厂类: class ProductFactory { private HashMap m_RegisteredProducts = new HashMap(); publi ...

  6. 设计模式-创建型模式-工厂模式(工厂三兄弟)

    设计模式-创建型模式-工厂模式(工厂三兄弟) 工厂模式分为简单工厂,工厂方法,抽象工厂. 简单工厂模式 一个接口,三个具体类,一个工厂,通过选择,生产出对应的对象. package demo2;pub ...

  7. C#之三十九 抽象工厂模式

    在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种 ...

  8. java基础5:工厂模式、单例模式、File文件类、递归、IO流、Properties配置文件、网络编程、利用IO流模拟注册登录功能、关于反射、JDK动态代理

    1.工厂模式 23种java设计模式之一 1)提供抽象类(基类) 2)提供一些子类,完成方法重写 3)提供一个接口:完成具体子类的实例化对象的创建,不能直接new子类,构造函数私有化. 优点:具体的子 ...

  9. java 反射 工厂_JAVA反射机制、工厂模式与SPRING IOC

    ABSTRACT Spring的IOC(控制反转)是Spring框架的灵魂,有了它才有了Spring的很多其他的灵活的特性.使用 Spring 开发项目时,控制层.业务层.DAO 层都是通过 IoC ...

  10. 解析Spring IOC原理——工厂模式与反射机制的综合应用

    (一)工厂模式 从一个例子开始讲起: 首先我们建立一个Chinese.java类,该类的sayHelloWorld(String name)方法,用中文对名为name的人问好,其内容如下: [java ...

最新文章

  1. __new__ __init__区别
  2. 视觉在无人驾驶中的应用及分类_机器视觉可以应用于水果自动分类拣选,你见过吗?...
  3. nagios监控远程端口
  4. python不能处理excel文件-python处理Excel文件
  5. Leetcode 257. 二叉树的所有路径 解题思路及C++实现
  6. php 批量更新死锁,php – 在尝试获取锁定时,哪个查询导致死锁;尝试重新启动事务...
  7. [CareerCup] 7.6 The Line Passes the Most Number of Points 经过最多点的直线
  8. 微信小程序调用百度云H5人脸识别
  9. 【Enhanced Time-Frequency Representation and Mode Decomposition】翻译1
  10. ERP规范正式实施 信息化可以对症下药?(转)
  11. 【Java加解密系列】- SM2生成密钥
  12. 使用python turtle库13行代码实现奥运五环
  13. ESP8266入门教程04:连接WIFI热点
  14. 从cocostudio获取控件,添加回调函数
  15. 读标准01-IEEE1451-智能传感器接口标准介绍
  16. 如何使用利用nat123实现内网穿透
  17. Unity鼠标控制物体360°旋转和点击移动
  18. c语言编程实现dsa算法,椭圆曲线加密算法的C语言实现.doc
  19. 一起来学C++:C++中的代码重用
  20. 新闻网站爬虫及结果查询

热门文章

  1. UI设计常用的矢量绘图工具Sketch 85 for mac
  2. Mac上功能强大图片查看编辑工具:zGallery
  3. Who am I:最烧脑的社会工程学电影
  4. TCP/IP 选项TcpTimedWaitDelay设置
  5. B/S架构 Web打印程序(Argox)
  6. Ext.form.field.Spinner微调字段
  7. 学习.net 2.0需要讲究一下策略
  8. 许多自己正在总结的东东
  9. maven 多环境打包发布的两种方式
  10. ]MySQL操作命令语句实例