国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

利用反射實(shí)現(xiàn)工廠模式

2019-11-14 13:30:42
字體:
供稿:網(wǎng)友

需求:工廠類根據(jù)參數(shù)生成對應(yīng)類的實(shí)例。

示例:

RoomParts.cs

namespace ReflectionFactory{    /// <summary>    /// 屋子產(chǎn)品的零件    /// </summary>    public enum RoomParts    {        Roof,        Window,        Pillar    }}

PRoductAttribute.cs

using System;namespace ReflectionFactory{    /// <summary>    /// 這個(gè)特性用來附加在產(chǎn)品類型之上,    /// 來標(biāo)注該類型代表哪個(gè)產(chǎn)品,方便反射使用    /// </summary>    public class ProductAttribute : Attribute    {        /// <summary>        /// 標(biāo)注零件的成員        /// </summary>        private RoomParts _myRoomPart;        public ProductAttribute(RoomParts part)        {            _myRoomPart = part;        }        public RoomParts RoomPart        {            get            {                return _myRoomPart;            }        }    }}

ProductListAttribute.cs

using System;namespace ReflectionFactory{    /// <summary>    /// 這個(gè)特性用來附加在產(chǎn)品接口之上    /// 用來標(biāo)注一共實(shí)現(xiàn)了多少產(chǎn)品零件,方便反射使用    /// </summary>    public class ProductListAttribute : Attribute    {        /// <summary>        /// 產(chǎn)品類型集合        /// </summary>        private Type[] _myList;        public ProductListAttribute(Type[] products)        {            _myList = products;        }        public Type[] ProductList        {            get            {                return _myList;            }        }    }}

iproduct.cs

using System;namespace ReflectionFactory{    /// <summary>    /// 產(chǎn)品零件接口,    /// 需要添加所有實(shí)現(xiàn)該接口的列表    /// </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接口獲得屬性            // 從而獲得所有的產(chǎn)品零件列表            ProductListAttribute attr = Attribute.GetCustomAttribute(typeof(IProduct),                 typeof(ProductListAttribute)) as ProductListAttribute;            // 遍歷所有的實(shí)現(xiàn)產(chǎn)品零件類型            foreach (Type type in attr.ProductList)            {                // 利用發(fā)射查找其屬性                ProductAttribute pa = Attribute.GetCustomAttribute(type,                     typeof(ProductAttribute)) as ProductAttribute;                // 確定是否是需要的零件                if (pa.RoomPart == part)                {                    // 利用反射創(chuàng)建產(chǎn)品零件類型                    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)        {            // 一共只有一個(gè)工廠,不再需要根據(jù)產(chǎn)品類型而挑選工廠            Factory factory = new Factory();            IProduct product = factory.Produce(part);            Console.WriteLine("生產(chǎn)了一個(gè)產(chǎn)品:" + product.GetName());            return product;        }    }}

Program.cs

using System;namespace ReflectionFactory{    class Program    {        static void Main(string[] args)        {            // output : 生產(chǎn)了一個(gè)產(chǎn)品:柱子            IProduct pillar = FactoryManager.GetProduct(RoomParts.Pillar);            // output : 生產(chǎn)了一個(gè)產(chǎn)品:屋頂            IProduct roof = FactoryManager.GetProduct(RoomParts.Roof);            // output : 生產(chǎn)了一個(gè)產(chǎn)品:窗戶            IProduct window = FactoryManager.GetProduct(RoomParts.Window);            Console.Read();        }    }}

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 天台县| 玛纳斯县| 滨海县| 普宁市| 遵化市| 济宁市| 靖西县| 沁阳市| 台前县| 根河市| 筠连县| 通化县| 宁蒗| 安丘市| 神木县| 疏勒县| 黑龙江省| 奉贤区| 赤壁市| 久治县| 正蓝旗| 桓台县| 肇东市| 铜山县| 博兴县| 陆丰市| 宜章县| 随州市| 广灵县| 宜川县| 江油市| 栖霞市| 景泰县| 南华县| 浮山县| 穆棱市| 彩票| 永宁县| 湘乡市| 远安县| 九龙坡区|