zoukankan      html  css  js  c++  java
  • 工厂设计模式

    今天学习了工厂模式,跟大家分享一下。

    工厂模式有三种,分别为:简单工厂模式、工厂方法模式、抽象工厂模式;其中注意:简单工厂模式不属于23种设计模式

    下面进行分别介绍这三种工厂模式:

    一、简单工厂模式

    简单工厂模式的组成:一个产品的接口、多个产品类分别实现这个接口、生产产品的工厂类

    生产汽车举个例子:

    1、定义一个汽车的接口:具有跑和停的功能

     2、定义车的产品分别实现这个接口

         

    3、定义一个车的工厂类,来实现车的生产(即:实例化

     4、调用工厂进行车的生产以及运行

    到此简单工厂模式介绍完成。

    熟悉设计模式溜达原则的同学都清楚,其实简单工厂模式违反了两大设计原则:开闭原则和单一职责原则

    我们来看一下这两种设计原则的定义:

    1、开闭原则:类对扩展开放,对修改关闭

    2、单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

    说明:

    1、当已有的某个产品产生变更时就会导致累的修改,违反了单一职责原则;

    1、当我们增加一个汽车产品时,就要修改CarFactory这个类,为它增加一个判断逻辑,违反了开闭原则

    为了解决这个问题引入了故而引入了工厂方法设计模式

    二、工厂方法设计模式

    工厂方法模式的组成:一个产品接口类、一个产品生产工厂接口类、多个具体产品类分别实现产品接口、多个具体产品生产工厂类分别实现产品生产工厂接口

    还用上述生产汽车做例子:

    1、产品接口类

    2、产品生产工厂类

    3、具体产品实现产品接口

        

    4、具体工厂实现产品工厂接口

         

    5、使用具体工厂创建对应的产品

     

    到此工厂方法模式介绍完成。

    它完美的解决了简单工厂违反的两个设计模式原则问题,当新增一个汽车产品时,只需要增加一个产品类和一个产品工厂就可以满足,相信现实生活中也是这么解决的。

    但是由于工厂方法模式中每个工厂只创建一类具体类的对象,这将会导致系统当中的工厂类过多,这势必会增加系统的开销。此时,我们可以考虑将一些相关的具体类组成一个“具体类族”,由同一个工厂来统一生产,这就是我们下面要说的抽象工厂模式的基本思想

    三、抽象工厂模式

    继续我们的造车计划,现在公司出台了一项政策,为了防止车在运输过程中刮蹭,在车出厂前要送到贴膜车间进行贴膜,如果按照上面的工厂方法实现的话,就在此基础上增加以下几个类:

    一个贴膜接口类、一个膜生产工厂接口类、多个具体贴膜类分别实现贴膜接口、多个具体膜生产工厂类分别实现膜生产工厂接口,是不是似曾相识,这不是按照生产汽车的过程又搞了一遍嘛,随着需求增加容易产生类爆炸,为了解决这个问题,就引入了抽象工厂模式

    它要完成生产车、贴膜都是需要那几个类来完成呢,请看下面描述

    1、一个产品接口类、、多个具体产品类分别实现产品接口

    2、一个贴膜接口类、多个具体贴膜类分别实现贴膜接口

    3、一个抽象产品生产工厂接口类、多个具体产品生产工厂类分别继承抽象产品生产工厂接口

    实现如下:

    1、产品接口类

     2、具体产品实现产品接口

        

    3、贴膜接口类

     4、贴膜实现类

        

    5、抽象工厂类,同时具有生产车和生产膜的功能

    6、抽象工厂实现类

      

    7、使用

     8、结果

    到此抽象工厂模式就介绍完成了。

    然后就有人有疑问了,虽然再添加一种车的生产很容易,只需要分别实现抽象工厂类、车产品接口、车贴膜接口

    但是如果此时又出来一个政策,贴膜不能解决刮蹭的问题,再出厂前除了贴膜还需要再套个盒子,那不是要修改抽象工厂类和所有继承了抽象工厂类的工厂了吗?

    这就违反了开闭原则了,而且如果产品很多,修改量会很大,关于这个问题,就说到了开闭原则的倾斜性问题。

    具体可以参考这个地址的解释:https://blog.csdn.net/lovelion/article/details/9319571

    故此可以看出,抽象工厂模式对于新增一个产品族来说很方便,但是对产品组内部进行加逻辑就会很复杂,所以还是要慎用的!

    到此三种工厂模式都介绍完毕了,你学废了吗???

    欢迎留言,相互学习!

  • 相关阅读:
    Spring框架中的单例bean是线程安全的吗?
    Spring Cloud 解决了哪些问题?
    服务端处理 Watcher 实现 ?
    内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?
    vue-router点击同一个页面异常处理
    mybatis代码生成+自定义注解+自定义注释
    lombok使用
    idea格式化设置
    寒假每周总结4
    寒假每日日报27
  • 原文地址:https://www.cnblogs.com/niuniu0108/p/15589133.html
Copyright © 2011-2022 走看看