利用反射实现工厂模式
需求:工厂类根据参数生成对应类的实例。
示例:
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. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...
- Java的反射机制 工厂模式综合讲解【转载自51CTO】
2019独角兽企业重金招聘Python工程师标准>>> Java的反射机制 工厂模式综合讲解 1.什么叫反射 Java.lang.reflect包下 正常情况下我们可以通过类实例化一 ...
- C#三层架构第九课之反射和工厂模式实现多数据库访问
反射和工厂模式实现不同数据库访问 在之前上课的基础上,使用反射和模唱模式,实现针对不同数据库的动态访问. 在之前的三层架构代码基础上进行修改. 使用三层架构+工厂模式,来实现一个程序访问多个数据库. ...
- 反射与工厂模式:早餐店的发展之路
实际开发中,接口的主要作用是为了不用层提供有一个操作的标准,如果直接实例化了类的操作[用new关键字来实例化],则一定存在耦合问题,可以用工厂模式解决此问题. 接下来用一个店主开早餐店的经历来阐述反射 ...
- java 反射实现 工厂模式_java – 用反射实现工厂模式
我正在实施工厂模式这是我的工厂类: class ProductFactory { private HashMap m_RegisteredProducts = new HashMap(); publi ...
- 设计模式-创建型模式-工厂模式(工厂三兄弟)
设计模式-创建型模式-工厂模式(工厂三兄弟) 工厂模式分为简单工厂,工厂方法,抽象工厂. 简单工厂模式 一个接口,三个具体类,一个工厂,通过选择,生产出对应的对象. package demo2;pub ...
- C#之三十九 抽象工厂模式
在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种 ...
- java基础5:工厂模式、单例模式、File文件类、递归、IO流、Properties配置文件、网络编程、利用IO流模拟注册登录功能、关于反射、JDK动态代理
1.工厂模式 23种java设计模式之一 1)提供抽象类(基类) 2)提供一些子类,完成方法重写 3)提供一个接口:完成具体子类的实例化对象的创建,不能直接new子类,构造函数私有化. 优点:具体的子 ...
- java 反射 工厂_JAVA反射机制、工厂模式与SPRING IOC
ABSTRACT Spring的IOC(控制反转)是Spring框架的灵魂,有了它才有了Spring的很多其他的灵活的特性.使用 Spring 开发项目时,控制层.业务层.DAO 层都是通过 IoC ...
- 解析Spring IOC原理——工厂模式与反射机制的综合应用
(一)工厂模式 从一个例子开始讲起: 首先我们建立一个Chinese.java类,该类的sayHelloWorld(String name)方法,用中文对名为name的人问好,其内容如下: [java ...
最新文章
- __new__ __init__区别
- 视觉在无人驾驶中的应用及分类_机器视觉可以应用于水果自动分类拣选,你见过吗?...
- nagios监控远程端口
- python不能处理excel文件-python处理Excel文件
- Leetcode 257. 二叉树的所有路径 解题思路及C++实现
- php 批量更新死锁,php – 在尝试获取锁定时,哪个查询导致死锁;尝试重新启动事务...
- [CareerCup] 7.6 The Line Passes the Most Number of Points 经过最多点的直线
- 微信小程序调用百度云H5人脸识别
- 【Enhanced Time-Frequency Representation and Mode Decomposition】翻译1
- ERP规范正式实施 信息化可以对症下药?(转)
- 【Java加解密系列】- SM2生成密钥
- 使用python turtle库13行代码实现奥运五环
- ESP8266入门教程04:连接WIFI热点
- 从cocostudio获取控件,添加回调函数
- 读标准01-IEEE1451-智能传感器接口标准介绍
- 如何使用利用nat123实现内网穿透
- Unity鼠标控制物体360°旋转和点击移动
- c语言编程实现dsa算法,椭圆曲线加密算法的C语言实现.doc
- 一起来学C++:C++中的代码重用
- 新闻网站爬虫及结果查询