最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c#典型工廠化實(shí)現(xiàn)實(shí)例

 更新時(shí)間:2013年03月28日 14:32:04   作者:  
c#典型工廠化實(shí)現(xiàn)實(shí)例,需要的朋友可以參考一下

工廠接口定義

復(fù)制代碼 代碼如下:

/// <summary>
    /// 工廠接口定義
    /// </summary>
    /// <remarks>
    ///     TTarget : abstract product type
    ///     TSource:  concrete product type
    /// </remarks>
    public interface IFactory
    {
        #region config and register type mapping

        /// <summary>
        /// 如果需要同時(shí)加載配置文件中定義的映射關(guān)系,可以按照SRP的原則定義獨(dú)立的配置類型。
        /// 由該配置類型調(diào)用這兩個(gè)接口為Factory加載配置信息
        /// </summary>

        IFactory RegisterType<TTarget, TSource>();  // fluent interface
        IFactory RegisterType<TTarget, TSource>(string name);   // fluent interface

        #endregion

        #region factory method

        TTarget Create<TTarget>();
        TTarget Create<TTarget>(string name);

        #endregion
    }

注冊(cè)類

復(fù)制代碼 代碼如下:

public sealed class TypeRegistry
    {
        readonly string DefaultNmae = Guid.NewGuid().ToString();
        IDictionary<Type, IDictionary<string, Type>> registry = new Dictionary<Type, IDictionary<string, Type>>();
        public void RegisterType(Type targetType,Type sourceType)
        {
            RegisterType(targetType, sourceType, DefaultNmae);
        }
        public void RegisterType(Type targetType, Type sourceType,string name)
        {
            if (targetType == null) throw new ArgumentNullException("targetType");
            if (sourceType == null) throw new ArgumentNullException("sourceType");
            if (string.IsNullOrEmpty(name)) throw new ArgumentNullException("name");
            IDictionary<string, Type> subDictionary;

            if (!registry.TryGetValue(targetType, out subDictionary))
            {
                subDictionary = new Dictionary<string, Type>();
                subDictionary.Add(name, sourceType);
                registry.Add(targetType, subDictionary);
            }
            else
            {
                if (subDictionary.ContainsKey(name))
                    throw new DuplicateKeyException(name);
                subDictionary.Add(name, sourceType);
            }
        }
        public Type this[Type targetType, string name]
        {
            get
            {
                if (targetType == null) throw new ArgumentNullException("targetType");
                if (string.IsNullOrEmpty(name)) throw new ArgumentNullException("name");
                if (registry.Count() == 0)
                    return null;

                return (registry
                    .Where(x => x.Key == targetType)).FirstOrDefault().Value
                    .Where(x => string.Equals(name, x.Key))
                        .FirstOrDefault().Value;
            }
        }

        public Type this[Type targetType]
        {
            get { return this[targetType, DefaultNmae]; }
        }

    }

工廠類

復(fù)制代碼 代碼如下:

public class Factory : IFactory
    {
        protected TypeRegistry registry = new TypeRegistry();

        #region IFactory Members

        public IFactory RegisterType<TTarget, TSource>()
        {
            registry.RegisterType(typeof(TTarget), typeof(TSource));
            return this;
        }

        public IFactory RegisterType<TTarget, TSource>(string name)
        {
            registry.RegisterType(typeof(TTarget), typeof(TSource), name);
            return this;
        }

        public TTarget Create<TTarget>()
        {
            return (TTarget)Activator.CreateInstance(registry[typeof(TTarget)]);
        }

        public TTarget Create<TTarget>(string name)
        {
            return (TTarget)Activator.CreateInstance(registry[typeof(TTarget), name]);
        }

        #endregion
    }

調(diào)用

復(fù)制代碼 代碼如下:

[TestMethod]
        public void CreateInstance()
        {
            var factory = new Factory()
                .RegisterType<IFruit, Apple>()
                .RegisterType<IFruit, Orange>("o")
                .RegisterType<IVehicle, Bicycle>()
                .RegisterType<IVehicle, Bicycle>("a")
                .RegisterType<IVehicle, Train>("b")
                .RegisterType<IVehicle, Car>("c");

            Assert.IsInstanceOfType(factory.Create<IFruit>(), typeof(Apple));
            Assert.IsInstanceOfType(factory.Create<IFruit>("o"), typeof (Orange));

            Assert.IsInstanceOfType(factory.Create<IVehicle>(), typeof(Bicycle));
            Assert.IsInstanceOfType(factory.Create<IVehicle>("a"), typeof(Bicycle));
            Assert.IsInstanceOfType(factory.Create<IVehicle>("b"), typeof(Train));
            Assert.IsInstanceOfType(factory.Create<IVehicle>("c"), typeof(Car));
        }

其實(shí)精髓還是在于注冊(cè)類的一個(gè)類似assembly的功能,通過(guò)字典的方式,封裝,然后通過(guò)泛型來(lái)比對(duì)實(shí)現(xiàn),或者通過(guò)配置文件傳參數(shù)過(guò)來(lái)實(shí)現(xiàn)出一個(gè)新的實(shí)例化

里面注意連貫接口,泛型,等操作

相關(guān)文章

  • C# xmlSerializer簡(jiǎn)單用法示例

    C# xmlSerializer簡(jiǎn)單用法示例

    這篇文章主要介紹了C# xmlSerializer簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了C#基于xmlSerializer操作xml的讀取、輸出等相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • C#最小二乘法擬合曲線成直線的實(shí)例

    C#最小二乘法擬合曲線成直線的實(shí)例

    這篇文章主要介紹了C#最小二乘法擬合曲線成直線的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • c#結(jié)構(gòu)和類的相關(guān)介紹

    c#結(jié)構(gòu)和類的相關(guān)介紹

    結(jié)構(gòu)和類的共同點(diǎn)都是屬于抽象數(shù)據(jù)類型,包含數(shù)據(jù)和數(shù)據(jù)的操作。不同點(diǎn)在于結(jié)構(gòu)偏重于數(shù)據(jù)語(yǔ)意,而類偏重於行為語(yǔ)意。
    2012-12-12
  • C#如何動(dòng)態(tài)設(shè)置屏幕分辨率

    C#如何動(dòng)態(tài)設(shè)置屏幕分辨率

    這篇文章主要為大家詳細(xì)介紹了C#動(dòng)態(tài)設(shè)置屏幕分辨率的方法,我們可以使用Screen類設(shè)置屏幕分辨率,感興趣的小伙伴們可以參考一下
    2016-04-04
  • C#如何使用DateTime.Now.AddDays方法獲取任一天的信息

    C#如何使用DateTime.Now.AddDays方法獲取任一天的信息

    使用DateTime.Now屬性可以得到當(dāng)前的日期信息,此時(shí)調(diào)用ToString方法,并在該方法中添加指定的格式化字符串,可以按照要求輸出當(dāng)前日期的信息,本文介紹C#使用DateTime.Now.AddDays方法獲取任一天的信息,感興趣的朋友一起看看吧
    2024-01-01
  • 使用C#編寫(xiě)兩個(gè)漂亮?xí)r鐘的示例代碼

    使用C#編寫(xiě)兩個(gè)漂亮?xí)r鐘的示例代碼

    這篇文章主要為大家分享了兩個(gè)使用C#編寫(xiě)的兩個(gè)漂亮?xí)r鐘的示例代碼,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-07-07
  • C#使用LINQ查詢文件列表并找出最大文件

    C#使用LINQ查詢文件列表并找出最大文件

    在現(xiàn)代 C# 開(kāi)發(fā)中,LINQ (Language Integrated Query) 提供了一種強(qiáng)大而優(yōu)雅的方式來(lái)處理集合數(shù)據(jù),本文將詳細(xì)介紹如何使用 LINQ 查詢文件系統(tǒng)中的文件,并找出最大的文件數(shù)量,需要的朋友可以參考下
    2024-10-10
  • C#實(shí)現(xiàn)貝塞爾曲線的方法

    C#實(shí)現(xiàn)貝塞爾曲線的方法

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)貝塞爾曲線的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • c#刪除代碼中的單行注釋行示例

    c#刪除代碼中的單行注釋行示例

    本文提供了c#刪除代碼中的單行注釋行的示例,還可以看到文件流的使用方法,大家參考使用吧
    2014-01-01
  • C#讀寫(xiě)txt文件多種方法實(shí)例代碼

    C#讀寫(xiě)txt文件多種方法實(shí)例代碼

    這篇文章主要介紹了C#讀寫(xiě)txt文件的小例子,大家可以參考使用
    2013-11-11

最新評(píng)論

库尔勒市| 镇安县| 济南市| 庆元县| 宁阳县| 正蓝旗| 中宁县| 渝北区| 长子县| 镶黄旗| 大邑县| 来安县| 蚌埠市| 达孜县| 三穗县| 儋州市| 会昌县| 江孜县| 西青区| 如皋市| 宣汉县| 清远市| 新疆| 内黄县| 蒙阴县| 元谋县| 漳平市| 新乐市| 汤原县| 西乌珠穆沁旗| 朝阳县| 朝阳市| 始兴县| 南郑县| 冀州市| 平乡县| 镶黄旗| 宣武区| 绥中县| 河南省| 湘潭县|