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

一個(gè)簡(jiǎn)單的 Generic Factory 類

  簡(jiǎn)單的工廠類的一個(gè)使用場(chǎng)景是, 假設(shè)有一個(gè)基類 BaseClass, 和一系列的子類 A, B, C, 工廠類根據(jù)某個(gè)參數(shù),例如字符串 “A”, “B”, “C” 創(chuàng)建出相應(yīng)的子類。 舉例如下:

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

  這里的一個(gè)問(wèn)題是, 當(dāng)子類增加或減少時(shí), Factory 類 需要相應(yīng)的改動(dòng)。 有沒(méi)有辦法可以只是改動(dòng)子類本身, 而不用修改Factory類呢, 當(dāng)然有,這里我舉一個(gè)簡(jiǎn)單的實(shí)現(xiàn)。

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

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

  假設(shè)我們有基類和子類實(shí)現(xiàn)如下

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 {}

 

  假設(shè)這些類都在同一個(gè) Assembly中 (對(duì)于不在同一個(gè)Assembly的,實(shí)現(xiàn)會(huì)稍微復(fù)雜些)工廠類需要預(yù)先加載 Key => Type 的Mapping, 然后根據(jù)Key創(chuàng)建不同的實(shí)例, 實(shí)現(xiàn)如下:

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!"); }}

  使用方法也很簡(jiǎn)單:

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

 

  對(duì)于其他類型的Key,比如 Enum, 或其他類型的基類, 改變Factory 的類型參數(shù)即可。

NET技術(shù)一個(gè)簡(jiǎn)單的 Generic Factory 類,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 黄色三级网址 | 伦理片在线3348 | 欧美深深色噜噜狠狠yyy | 最新男同鸭子ktv | 美女屁股软件 | 国产AV天堂一区二区三区 | 成年人视频在线免费观看 | 久草色在线 | 国产成人在线视频观看 | 狠狠躁日日躁人人爽 | 亚洲精品一区二区在线看片 | 国产成人无码视频一区二区三区 | 妖精视频免费看 | 国语对白刺激真实精品 | 长篇高h肉爽文丝袜 | 久久热国产在线视频 | 国精品产露脸偷拍视频 | 国产成人精品系列在线观看 | 国产网站免费观看 | 国产精品伦一区二区三级视频 | 欧美三级不卡在线观线看 | 精品AV综合导航 | 日韩吃奶摸下AA片免费观看 | 亚洲人成电影网站在线观看 | 成人在线观看免费视频 | 芳草地在线观看免费视频 | 亚洲欧美中文日韩视频 | 无码乱人伦一区二区亚洲一 | 伊人激情综合网 | 男gv纯肉免费视频 | 永久免费看mv网站入口 | 无人区日本电影在线观看 | 国产在线精品亚洲观看不卡欧美 | 久久精品综合网中文字幕 | 国产97碰免费视频 | 果冻传媒色AV国产播放 | 中文字幕AV亚洲精品影视 | 办公室的秘密2中文字幕 | 在线不卡日本v二区到六区 在线不卡日本v二区 | 青娱乐视觉盛宴国产视频 | 亚洲高清无在码在线电影 |