• 设计模式之工厂模式系列


        在开发中,工厂模式为我们提供了一种松耦合的形式,在一些需要频繁构造比较复杂的对象时,就可以使用工厂模式,通过对象工厂为我们提供实例,这样在后期维护的时候可以统一的对实例对象的过程进行管理升级。

        工厂模式分为三种:简单工厂模式,工厂方法模式,抽象工厂模式。

      简单工厂模式:

      先看一下代码:

    static class SimpleFactoryPattern
    {
        public static IProduct makeProduct(ProductClass pc)
        {
            //返回对应的实例
            switch (pc)
            {
                case ProductClass.one: return new ProductOne();
                case ProductClass.two: return new ProductTo();
            }
            throw new Exception("no this product");
        }
    }
    ​
    enum ProductClass
    {
        one,
        two,
    }
    //将产品抽象
    interface IProduct
    {
        void Production();
    }
    ​
    class ProductOne : IProduct
    {
        public void Production()
        {
            Console.WriteLine("产品1");
        }
    }
    ​
    class ProductTo : IProduct
    {
        public void Production()
        {
            Console.WriteLine("产品2");
        }
    }

        简单工厂模式的代码逻辑比较容易理解,它的主要优点是:客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确,客户端无需知道所创建具体产品的类名,只需知道参数即可,但是它的缺点也显而易见:简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。

        因此,经过进一步发展,工厂方法模式出现了。

        工厂方法模式:

        工厂方法模式是对简单工厂模式的进一步抽象化。它将工厂也部分抽象出来,对应的每个工厂只生产一个实例。用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程,对于新产品的创建,只需多写一个相应的工厂类,我们下面看一下实现代码:

    interface IFactory
    {
        IProduct makeProduct();
    }
    ​
    class FactoryMethodPatternOne : IFactory
    {
        public IProduct makeProduct()
        {
            return new ProductOne();
        }
    }
    class FactoryMethodPatternTwo : IFactory
    {
        public IProduct makeProduct()
        {
            return new ProductTo();
        }
    }
    ​
    interface IProduct
    {
        void Production();
    }
    ​
    class ProductOne : IProduct
    {
        public void Production()
        {
            Console.WriteLine("产品1");
        }
    }
    ​
    class ProductTo : IProduct
    {
        public void Production()
        {
            Console.WriteLine("产品2");
        }
    }

        当然,这种逻辑,还是存在着问题,一个工厂只能生产一个类,增加了代码复杂度,而且难以理解,为了更好的完善工厂模式,后来又推出了新的工厂模式:抽象工厂模式。

        抽象工厂模式:

        抽象工厂将工厂彻底抽象出来,每个抽象工厂可以生产多种相互关联的对象,像华为生产不只生产手机,还生产电脑,平板。下面看一下代码:

    interfaceIFactory
    {
        IProduct makeCar();
        IProduct makeClothes();
    }
    ​
    class FactoryOne : IFactory
    {
        public IProduct makeCar()
        {
           return new BYD();
        }
    ​
        public IProduct makeClothes()
        {
           return new Lining();
        }
    }
    ​
    interface IProduct
    {
        void Production();
    }
    ​
    class Lining : IProduct
    {
        public void Production()
        {
            Console.WriteLine("产品1");
        }
    }
    ​
    class BYD : IProduct
    {
        public void Production()
        {
            Console.WriteLine("产品2");
        }
    }

       但是抽象工厂模式,半违背开发-封闭原则:

    • 当增加一个新的产品族时只需增加一个新的具体工厂,不需要修改原代码,满足开闭原则。

    • 当产品族中需要增加一个新种类的产品时,则所有的工厂类都需要进行修改,不满足开闭原则。

        这三个工厂模式,都有自己的应用场景,不必过于纠结其缺点,开发时最合适的就是最好的。

    这是我的公众号二维码,获取最新文章,请关注此号

  • 相关阅读:
    ADO.NET存取数据库数据
    2017-01-03
    re模块
    random模块(随机)
    sys模块
    os模块
    datetime模块
    time模块
    logging模块
    Python函数初识
  • 原文地址:https://www.cnblogs.com/charlesmvp/p/13772624.html
Copyright © 2020-2023  润新知