简单工厂模式

回到首页

概述

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

结构图

 

实现

简单工厂实现

 产品类

    /// <summary>
    /// A号产品
    /// </summary>
    public class ConcreteProductA : IProduct
    {
        public ConcreteProductA()
        {
            Name = "产品A";
            Console.WriteLine("ConcreteProductA初始化了");
        }
        public string Name { get; set; }

        public void Operation()
        {
            Console.WriteLine("产品名称:" + Name);
            Console.WriteLine("执行操作1:" + Name);
            Console.WriteLine("执行操作2:" + Name);
        }
    }
    /// <summary>
    /// B号产品
    /// </summary>
    public class ConcreteProductB : IProduct
    {
        public ConcreteProductB(string name)
        {
            Name = name;
            Console.WriteLine("ConcreteProductB初始化了");
        }
        public string Name { get; set; }
        public void Operation()
        {
            Console.WriteLine("产品名称:" + Name);
            Console.WriteLine("执行操作2:" + Name);
            Console.WriteLine("执行操作3:" + Name);
        }
    }
    /// <summary>
    /// 默认
    /// </summary>
    public class ConcreteProductDefault : IProduct
    {
        public ConcreteProductDefault()
        {
            Name = "默认产品";
            Console.WriteLine("ConcreteProductDefault初始化了");
        }
        public string Name { get; set; }

        public void Operation()
        {
            Console.WriteLine("产品名称:" + Name);
            Console.WriteLine("不执行操作");
        }
    }

 

工厂类

  /// <summary>
    /// 简单工厂类
    /// </summary>
    public class SimpleFactory
    {
        /// <summary>
        /// 获取产品实例
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public IProduct GetProduct(string code = "")
        {
            IProduct product = null;
            switch (code)
            {
                case "产品A":
                    {
                        product = new ConcreteProductA();
                    }
                    break;
                case "产品B":
                    {
                        product = new ConcreteProductB("测试产品B");
                    }
                    break;
                default:
                    {
                        product = new ConcreteProductDefault();
                    }
                    break;
            }
            return product;
        }
    }

 

主程序

        static void Main(string[] args)
        {
            DateTime beforDT = DateTime.Now;
            SimpleFactory simpleFactory = new SimpleFactory();
            List<IProduct> products = new List<IProduct>();
            //使用工厂初始化了3个产品对象
            for (int i = 0; i < 1000; i++)
            {
                products = new List<IProduct>() {
                    simpleFactory.GetProduct("产品A"),
                    simpleFactory.GetProduct("产品B"),
                    simpleFactory.GetProduct(),
                };
            }
            //执行方法,对于初始化的工作主要交给了工厂类,Main方法只通过了简单的逻辑判断就获得了对象的实例
            foreach (var product in products)
            {
                product.Operation();
            }
            DateTime afterDT = DateTime.Now;
            TimeSpan ts = afterDT.Subtract(beforDT);
            Console.WriteLine("DateTime总共花费{0}ms.", ts.TotalMilliseconds);
            Console.ReadKey(); 
        }

运行结果

 

 

 结合单例模式,将创建对象缓存

产品类

    /// <summary>
    /// A号产品
    /// </summary>
    public class ConcreteProductA : IProduct
    {
        public ConcreteProductA()
        {
            Name = "产品A";
            Console.WriteLine("ConcreteProductA初始化了");
        }
        public string Name { get; set; }

        public void Operation()
        {
            Console.WriteLine("产品名称:" + Name);
            Console.WriteLine("执行操作1:" + Name);
            Console.WriteLine("执行操作2:" + Name);
        }
    }
    /// <summary>
    /// B号产品
    /// </summary>
    public class ConcreteProductB : IProduct
    {
        public ConcreteProductB(string name)
        {
            Name = name;
            Console.WriteLine("ConcreteProductB初始化了");
        }
        public string Name { get; set; }
        public void Operation()
        {
            Console.WriteLine("产品名称:" + Name);
            Console.WriteLine("执行操作2:" + Name);
            Console.WriteLine("执行操作3:" + Name);
        }
    }
    /// <summary>
    /// 默认
    /// </summary>
    public class ConcreteProductDefault : IProduct
    {
        public ConcreteProductDefault()
        {
            Name = "默认产品";
            Console.WriteLine("ConcreteProductDefault初始化了");
        }
        public string Name { get; set; }

        public void Operation()
        {
            Console.WriteLine("产品名称:" + Name);
            Console.WriteLine("不执行操作");
        }
    }

 

工厂类

    public class CacheSimpleFactory
    {
        private static ConcurrentDictionary<string, IProduct> keyValuePairs = new ConcurrentDictionary<string, IProduct>();
        /// <summary>
        /// 获取产品实例
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public IProduct GetProduct(string code = "")
        {
            IProduct product = null;
            switch (code)
            {
                case "产品A":
                    {
                        if (keyValuePairs.TryGetValue(code, out product))
                        {
                        }
                        else
                        {
                            product = new ConcreteProductA();
                            keyValuePairs.TryAdd(code, product);
                        }
                    }
                    break;
                case "产品B":
                    {
                        if (keyValuePairs.TryGetValue(code, out product))
                        {
                        }
                        else
                        {
                            product = new ConcreteProductB("测试产品B");
                            keyValuePairs.TryAdd(code, product);
                        }
                    }
                    break;
                default:
                    {
                        if (keyValuePairs.TryGetValue(code, out product))
                        {
                        }
                        else
                        {
                            product = new ConcreteProductDefault();
                            keyValuePairs.TryAdd(code, product);
                        }
                    }
                    break;
            }
            return product;
        }
    }

 

客户端

        static void Main(string[] args)
        {
            DateTime beforDT = DateTime.Now;
            CacheSimpleFactory simpleFactory = new CacheSimpleFactory();
            List<IProduct> products = new List<IProduct>();
            //使用工厂初始化了3个产品对象
            for (int i = 0; i < 1000; i++)
            {
                products = new List<IProduct>() {
                    simpleFactory.GetProduct("产品A"),
                    simpleFactory.GetProduct("产品B"),
                    simpleFactory.GetProduct(),
                };
            }
            //执行方法,对于初始化的工作主要交给了工厂类,Main方法只通过了简单的逻辑判断就获得了对象的实例
            foreach (var product in products)
            {
                product.Operation();
            }
            DateTime afterDT = DateTime.Now;
            TimeSpan ts = afterDT.Subtract(beforDT);
            Console.WriteLine("DateTime总共花费{0}ms.", ts.TotalMilliseconds);
            Console.ReadKey(); 
        }

 

运行结果

 

 可以看到使用缓存实现的在当存在需要频繁创建对象的时候效率要远快于不进行缓存的

优势

工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。

缺点

由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

使用场景

工厂类负责创建的对象比较少

客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心

由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用

Demo

 

posted @ 2021-09-29 17:58  .NET_CJL  阅读(62)  评论(0)    收藏  举报