利用反射实现工厂模式

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

示例:

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();
        }
    }
}
时间: 2024-10-07 03:52:49

利用反射实现工厂模式的相关文章

JAVA的反射和工厂模式的例子实现

一.JAVA的反射 在学习反射的时候就没太弄明白,现在看了一些资料认真学习一下,暂时记录此刻的笔记. 1.java反射的概念: 就是java程序运行时才确定哪个类被加载了,编译器不知道该加载哪个类.这种特点就是反射.反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 其实我们的本地IDE就是使用了这种机制,当我们敲入某个类名然后按下.点号的时候,自

Java反射+简单工厂模式总结

除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 一般情况下,最直接的写法为: public class Apple { public void get() { System.out.println("得到苹果"); } }   public class Banana { public void get() { System.out.p

反射+抽象工厂模式

这里通过一个DEMO介绍反射配合抽象工厂模式的运用.大概业务背景就是在实际业务过程中,可能要替换数据库,具体代码如下: 1.User实体类 class User { private int id; private string name; public int Id { get { return id; } set { id = value; } } public string Name { get { return name; } set { name = value; } } } 2.操作U

通过配置文件,反射,工厂模式实现IOC控制反转

package designMode; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.Properties; interface Fruit{ public abstract void eat(); } class A

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

在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式. 重点: ?      抽象工厂模式概念 ?      抽象工厂模式的模型图 ?      抽象工厂模式访问多种数据库 预习功课: ?      什么是抽象工厂模式 ?  

23种设计模式(2)-简单工厂模式

这些设计模式都是在这么多年的软件开发中,先辈对软件重构的经验总结提炼的结果,这些设计模式要遵循软件设计的六原则.每一种设计模式都有相应的需求场景的.有了这些设计模式的思想和面向对象的思想,在软件设计特定的需求中会给你解决思路. 一,需求场景 在此,我也借用书上看到的一个例子.计算器工厂给我们留了一些任务,设计一个计算器做成成品卖给买家.但是这个任务是分两个阶段让我们实现的.如下: 阶段一:买家目前只需要计算器具有加减程序的功能即可.别的功能待市场需求再做设计.也就是阶段二的任务. 阶段二:阶段一

小菜学设计模式——抽象工厂模式

背景 简单工厂.工厂方法模式,接着必须学习抽象工厂模式 1.使用意图 扩展工厂方法模式 2.生活实例 淘宝电影.猫眼电影都能为我们生成当天各种电影票 3.Java 例子(框架.JDK .JEE) 个人觉得实实在在的根据抽象工厂模式定义的类应该会很少,毕竟不方便扩展,虽然它是一种很了不起的思想.一般都会采用反射机制+抽象工厂完成,比如,JDBC模块,在使用DriverManger.getConnection 这一步之前,必须要先加载驱动,也就是 Class.forname(class);这里指定c

C++利用反射和简单工厂模式实现业务模块解耦

1. 业务说明 为了便于说明,举一个简单的例子.假设现在有一个项目需要建立一个和银行交互的平台,目前只接入工商银行,后续接入其他银行,每个银行的业务都有差异,报文格式可能也不一致. 这里只列举几个简要的流程,仅包括拼报文,发送报文,接收报文,解析报文,其余整体架构以及后续处理等内容省略. 2. 初步设计 创建一个银行交互类 BankOpt,包括四个函数: int setMsg(); //拼报文 int sendMsg(); //发送报文 int getMsg(); //接收报文 int pars

基于C#反射机制的工厂模式

简单介绍 反射提供了描写叙述程序集.模块和类型的对象(Type 类型). 能够使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或訪问其字段和属性. 假设代码中使用了特性.能够利用反射来訪问它们. 这里的类型信息包含类型的方法,变量名称.类型等信息. 基于反射机制的工厂模式 例如以下图所看到的,游戏中经常使用的掉落物模型,Item是基类,定义了一些基础属性,也定义了一些abstract方法. Food和Weapon继承自Item.表示一类Item.再下一层的类就定