程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> 利用反射實現工廠模式

利用反射實現工廠模式

編輯:C#基礎知識

需求:工廠類根據參數生成對應類的實例。

示例:

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();
        }
    }
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved