工厂模式之二——工厂模式【弥补简单工厂模式弊端】

     首先回顾下简单工厂模式的主要内容:简单工厂模式就是实质就是专门定义了一个工厂类,利用工厂类的静态方法来根据用户需求创建对象,优点是客户端的压力较小,客户端不需要做创建实例的操作,只需要调用工厂类中的方法就可以获得对应实例,而其缺点也非常明显,其所有创建工作都在一个工厂类完成,耦合性较高,而且当系统需要增加或者修改产品时需要改动工厂类,既不符合单一职责的原则也不符合开放-关闭原则,所以就出现了工厂模式。

工厂模式 

工厂模式是对简单工厂模式的进一步抽象化,是简答工厂模式的衍生,根据设计模式的基本原则也是设计模式的精髓“封装变化点”,即哪里发生改变就把哪里封装起来,所以工厂模式对简单工厂中的工厂类做了一个封装,使其满足单一职责和开放-关闭原则。

【解决问题】:简单工厂模式中违背了单一职责和开放-关闭原则。

【核心思想】:建立一个抽象工厂的基类,给每个产品建立一个工厂,该工厂继承之抽象工厂,规定每个产品都有特定的工厂来创建。

【角色】

抽象工厂角色:这是工厂模式的核心,它与应用程序无关,是具体工厂必须继承的父类或者必须实现的接口

具体工厂角色:包含逻辑业务的代码,由应用程序调用以创建对应的具体产品对象

抽象产品角色:具体产品必须继承的父类或者必须实现的接口

具体产品角色:所创建的对象就是此角色的实例 

 

下面仍旧以简单工厂中的实例来讲解,对其进行改造

【角色分析】

抽象工厂:衣服制造厂 包含衣服的一些公共特性
具体工厂:**类型衣服制造厂 每个衣服制造厂只负责一件衣服(高内聚) ,当然也就是说当没有客户需要的衣服的时候需要创建一个对应的工厂及一件衣服 由该工厂负责提供这件衣服 但是对于以前的工厂和衣服都没有影响(这是设计模式所期望的--单一职责原则)
抽象产品:衣服 包含衣服的一些公共特性
具体产品:**类型衣服 继承抽象产品,当然可扩展自身特性

================================代码片段讲解==============================


角色分析好了,就可以进行改造了,贴上改造完毕的各个部分代码: 

抽象工厂类:

1       // 抽象工厂:声明工厂方法 返回一个产品
2        public   abstract   class  ClothFactory
3      {
4          public   abstract  Cloth CreateCloth();
5      }

该类中定义了一个抽象的CreateCloth()方法,用于创建衣服实例。

具体工厂类:

具体工厂 1     //具体工厂1:商务装工厂 只负责生产商务装
    public class BusinessFactory : ClothFactory
    {
        public override Cloth CreateCloth()
        {
            return new BusinessCloth();
        }
    }

    //具体工厂2:运动装工厂 只负责生产运动装
    public class SportFactory : ClothFactory
    {
        public override Cloth CreateCloth()
        {
            return new SportCloth();
        }
    }

    //具体工厂3:校服工厂 只负责生产校服
    public class LifeFactory : ClothFactory
    {
        public override Cloth CreateCloth()
        {
            return new LifeCloth();
        }

    }


该类为核心,类中定义了BusinessFactorySportFactory,LifeFactory三个工厂分别来创建商务装运动装校服,三个工厂都继承之抽象工厂ClothFactory,并都重写了抽象工厂中的CreateCloth()方法,分别用来创建该工厂生产的衣服,利用里氏替换原则(子类代替父类)来实现,这是产品需要改变(添加,修改,删除)时,如添加,只需要添加一个专门生产该产品的工厂和该产品就可以了,添加操作对之前所有的工厂和产品没有直接的影响。修改同理,只需要修改创建该产品的工厂类就可以了,很好的遵循了开放-关闭原则,同时一个工厂类创建一个产品,遵循了单一职责的原则。

抽象产品类:

1      // 定义抽象产品:衣服
2        public   abstract   class  Cloth
3      {
4          public   abstract   void  GetCloth();
5      }

该方法不需要作改变,仍旧定义了一个GetCloth()方法,模拟使用产品。

具体产品类:

具体产品 1     //定义具体产:1:商务装
    class BusinessCloth : Cloth
    {
        public override void GetCloth()
        {
            Console.WriteLine("商务装......");
        }
    }
    //定义具体产品2:运动装
    class SportCloth : Cloth
    {
        public override void GetCloth()
        {
            Console.WriteLine("运动装.......");
        }
    }
    //定义具体产品3:休闲服
    class LifeCloth : Cloth
    {
        public override void GetCloth()
        {
            Console.WriteLine("休闲服........");
        }
    }

该类也不需要作任何改变,根据哪里封装改变哪里,工厂类的封装和产品没有直接的影响,仍旧定义了三种类型的衣服,并重写抽象产品中的抽象方法,因为每种产品都有自身特性,有自身独特的功能。

客户端: 

客户端 1     //客户端
    class Program
    {
        static void Main(string[] args)
        {
            //要求商务装
            Cloth c = new BusinessFactory().CreateCloth();
            c.GetCloth();
            //要求运动装
            Cloth c2 = new SportFactory().CreateCloth();
            c2.GetCloth();
            Console.ReadKey();
        }
    }

工厂模式小结:

优点:解决了简单工厂中违背单一职责和开放-关闭原则问题,同时增加了程序的可扩展性,屏蔽了产品类。

缺点:1.逻辑判断放在了客户端进行

        2.每添加一个产品都需要为它专门添加一个工厂用来生产,繁杂

        3.每个工厂都只能生产一种产品,品种单一。 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值