工厂设计模式

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

工厂模式有三种,分别为:简单工厂模式、工厂方法模式、抽象工厂模式;其中注意:简单工厂模式不属于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

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

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

欢迎留言,相互学习!

原文地址:https://www.cnblogs.com/niuniu0108/p/15589133.html