麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

利用反射實現工廠模式

2019-11-14 13:30:42
字體:
來源:轉載
供稿:網友

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

示例:

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

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美 日韩 三区 | 超久久 | 毛片在线播放视频 | 免费日本一区二区 | 亚洲网站在线观看视频 | 毛片av网址 | 精品亚洲在线 | 欧美日韩夜夜 | 一本色道久久综合狠狠躁篇适合什么人看 | 热99热| 久草在线综合网 | av电影免费在线 | 55夜色66夜色国产精品视频 | 日韩精品久久久久久久九岛 | 欧美精品欧美极品欧美激情 | 91久久线看在观草草青青 | 91午夜少妇三级全黄 | 亚洲自拍第一 | 色人阁导航 | 爱操成人网 | 久久精品国产久精国产 | 蜜桃网站免费 | 成人福利视频导航 | 色成人在线 | 国产大片中文字幕在线观看 | 免费一级a毛片在线播放视 日日草夜夜操 | 久久精品视频12 | 久久国产精品免费视频 | 有兽焉免费动画 | 女人裸体让男人桶全过程 | 欧美日韩精品一区二区三区蜜桃 | 九九热在线视频免费观看 | 黄网免费看 | 黄色伊人网站 | 特黄一级小说 | 免费看综艺策驰影院 | 午夜精品成人 | 成人wxx视频免费 | 成人羞羞视频在线观看 | 激情网站免费观看 | 欧美视频一二区 |