中文字幕日韩一区二区_国产一区二区av_国产毛片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 類,轉載需保留來源!

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

    主站蜘蛛池模板: 久草电影网 | 成人免费小视频 | 欧美色偷拍 | 91中文字幕在线观看 | 毛片一级片| 精品久久久久久亚洲综合网站 | 欧美性乱 | 精品久久久一区二区 | 日韩毛片网 | 日本免费一区二区三区四区 | 亚洲综合久久久 | 成人不卡| 亚洲国产成人精品女人久久久 | 亚洲欧美日韩在线 | 色屁屁在线观看 | 男人的天堂亚洲 | 欧美日韩不卡合集视频 | 国产精品一区二区av | 午夜精品久久久久久久星辰影院 | 99精品在线观看 | 天天艹| 日韩电影免费在线观看中文字幕 | 久久99精品国产 | 亚洲成人在线视频播放 | 日本一级淫片免费啪啪3 | 精品乱码一区二区三四区 | 亚洲综合天堂网 | 欧美日韩理论 | 老牛嫩草一区二区三区av | 中文字幕一区二区三区不卡 | 一区二区三区四区av | 成人在线观看网站 | 亚洲一区二区在线播放 | 免费在线成人 | 欧美精品日韩 | 天天曰夜夜 | 国产成人99久久亚洲综合精品 | 中文字幕在线三区 | 欧美一区在线看 | 日韩成人一区二区 | 18av在线播放 |