天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

一個簡單的 Generic Factory 類

  簡單的工廠類的一個使用場景是, 假設有一個基類 BaseClass, 和一系列的子類 A, B, C, 工廠類根據某個參數,例如字符串 “A”, “B”, “C” 創建出相應的子類。 舉例如下:

public class Factory{    public static BaseClass Create(string name)    {        switch (name)        {            case "A": return new A();            case "B": return new B();            case "C": return new C();            default: throw new ArgumentException("Wrong Name");        }    }}

  這里的一個問題是, 當子類增加或減少時, Factory 類 需要相應的改動。 有沒有辦法可以只是改動子類本身, 而不用修改Factory類呢, 當然有,這里我舉一個簡單的實現。

  基本思想是在每個子類上附加一個 Attribute, 定義如下:

[AttributeUsage(AttributeTargets.Class)]public class FactoryKeyAttribute : Attribute{    public object Key { get; set; }}

  假設我們有基類和子類實現如下

public abstract class BaseClass {}[FactoryKey(Key = "Standard")]public class Standard : BaseClass {}[FactoryKey(Key = "Enterprise")]public class Enterprise : BaseClass {}[FactoryKey(Key = "Lite")]public class Lite : BaseClass {}

 

  假設這些類都在同一個 Assembly中 (對于不在同一個Assembly的,實現會稍微復雜些)工廠類需要預先加載 Key => Type 的Mapping, 然后根據Key創建不同的實例, 實現如下:

public static class Factory<TKey, TBaseClass>{    private static readonly IDictionary<TKey, Type> TypeDict = Init();    private static IDictionary<TKey, Type> Init()    {        var dict = from type in Assembly.GetExecutingAssembly().GetTypes()                   let key = (FactoryKeyAttribute)Attribute.GetCustomAttribute(type, typeof(FactoryK
eyAttribute
)) where key != null && type.IsSubclassOf(typeof(TBaseClass)) select new { Key = key, Value = type }; return dict.ToDictionary(kvp => (TKey)kvp.Key.Key, kvp => kvp.Value); } public static TBaseClass CreateInstance(TKey key) { Type type; if (TypeDict.TryGetValue(key, out type)) { return (TBaseClass)Activator.CreateInstance(type); } throw new ArgumentException("Incorrect Key!"); }}

  使用方法也很簡單:

BaseClass s = Factory<string, BaseClass>.CreateInstance("Standard");BaseClass l = Factory<string, BaseClass>.CreateInstance("Lite");BaseClass e = Factory<string, BaseClass>.CreateInstance("Enterprise");

 

  對于其他類型的Key,比如 Enum, 或其他類型的基類, 改變Factory 的類型參數即可。

NET技術一個簡單的 Generic Factory 類,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 免费观看视频成人国产 | 久久久视频2019午夜福利 | 污污内射久久一区二区欧美日韩 | 男女性杂交内射妇女BBWXZ | 又色又爽又黄gif动态视频 | 国产精品成人在线播放 | 国产叼嘿久久精品久久 | 99精品免费久久久久久久久蜜桃 | 成年人免费在线视频观看 | 国产亚洲精品AV片在线观看播放 | 第一会所欧美无码原创 | 中文字幕在线观看 | 亚洲视频 在线观看 | 一区精品在线 | 日本欧美高清一区二区视频 | 欧美内射深插日本少妇 | 国产亚洲精品久久久久久久 | 一个人免费视频在线观看高清频道 | 国产精品久久久久久熟妇吹潮软件 | 九九在线精品视频 | 2012中文字幕在线动漫电影 | 动漫美女被吸奶 | 伊人色综合久久天天 | 午夜福到在线4国产 | 快穿女主有名器的H纯肉黄暴拉文 | 国产精品成人啪精品视频免费观看 | 果冻传媒在线播放 免费观看 | 成人1000部免费观看视频 | 韩国污动漫无遮掩无删减电脑版 | 亚洲无吗精品AV九九久久 | 久久re这里精品23 | 麻豆狠色伊人亚洲综合网站 | 亚洲另类欧美综合在线 | 中文乱码35页在线观看 | 色色激情网| 一个人在线观看免费视频 | 双性大乳浪受噗呲噗呲h总 双性被疯狂灌满精NP | 中国xxxxxx片免费播放 | 国偷自产视频一区二区99 | 蜜桃视频一区二区 | 亚在线观看免费视频入口 |