麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

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

2020-01-24 03:30:44
字體:
供稿:網(wǎng)友

工廠接口定義

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

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

        /// <summary>
        /// 如果需要同時加載配置文件中定義的映射關(guān)系,可以按照SRP的原則定義獨立的配置類型。
        /// 由該配置類型調(diào)用這兩個接口為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
    }

注冊類

復(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));
        }

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 九九热九九热 | 免费国产精品视频 | 日韩黄色免费电影 | 精品国产一区在线观看 | 毛片a级毛片免费播放100 | 日美黄色片 | 特级西西444www大精品视频免费看 | 欧美一级网 | 伊人一二三四区 | 日本黄色免费片 | 亚洲综合一区二区三区 | 中文字幕h | 一级做人爱c黑人影片 | 成人毛片视频在线观看 | 国产免费v片 | 亚洲精品一二三区 | 国产精品6区 | 日韩一级毛毛片 | 欧美成人免费看 | 欧美精品免费一区二区三区 | 欧美3p激情一区二区三区猛视频 | 免费在线观看国产精品 | 亚洲天堂在线电影 | 欧美3p激情一区二区三区猛视频 | 久久成人在线观看 | 色啪综合 | 91午夜视频 | 亚洲性生活免费视频 | 日本黄色免费观看视频 | 国产永久免费观看 | 久久国语对白 | 九色成人在线 | 欧美日韩国产成人在线 | 少妇一级淫片免费看 | 日本高清黄色片 | 蜜桃成品人免费视频 | 精品一区二区在线播放 | 久久国产精品区 | 久久久久久久久久美女 | 亚洲影视在线观看 | 污视频在线免费播放 |