###一、前言:
昨天老表问了我一个问题,也就是标题,简单工厂、工厂方法模式和抽象工厂模式区别?也不算是问,就是他说了自己的见解,问我理解的对不对,这我就比较尴尬了,老表又是学霸,我在他面前根本就是小菜嘛,哈哈。
老表是这样子说的,我把他话复制下来了↓
三者的重点就是:围绕工厂类和产品类来进行讨论,其中工厂类可以是抽象的或是具体的,产品类也为抽象或是具体的,就一个总的概念而言,产品必须为抽象的(比如,水果、工具),当然它包括具体的实例(苹果、西瓜,扳手、螺丝刀等)
####简单工厂(一个具体的工厂类,一个抽象的产品类,但这个工厂可以生产很多的同类型的产品):
如果我们有一个生产水果的工厂,那么这个工厂类我们定义为一个具体工厂,生产的产品(水果)定义为一个接口或是抽象类,假设现在工厂可以生产桃子和苹果两种产品,如果要加入西瓜这种产品,就必须要修改工厂这个具体类,才能达到可以生产西瓜这个产品。(这里就破坏了OCP原则)
####工厂方法模式(一个抽象的工厂<可以有多个具体的工厂>和一个抽象的产品类<可以有多个具体的同一类型的产品>,但是每个具体工厂就只能创建一个具体产品):
比如我们现在有一个抽象的工厂,两个具体的工厂,一个生产苹果,一个生产西瓜。一个抽象的产品类(水果),两种产品,苹果和西瓜。这里如果我们要加入桃子这种产品,只需再弄一个具体工厂和具体产品即可。符合开闭原则、单一职责。但是如果我们想要得到一个装水果的水果篮,就不行了,因为抽象的产品是抽象的水果,不是工具。
####抽象工厂模式(一个抽象工厂<多个具体工厂>,多个抽象产品<不同类别的具体产品>、每个具体工厂就可以创建多个具体产品):
我们就可以实现,一个工厂,即生产苹果的同时,又可生产装苹果的篮子。
综上所诉,简单工厂是一个工厂,一种产品类型,多种同类型产品。工厂方法模式,多个工厂,一种产品类型,具体分工,一个工厂生产一种产品。抽象工厂,多个工厂,多种产品类型,一个工厂可以实现几个类型的产品。
你看看我这样描述有问题吗?
###二、个人理解:
这个问题一提出来,我立马查看了这几个设计模式的,有点生疏了,也是平时没有总结的原因,这点必须反思,老表说的也八九不离十,也很生动。
####简单模式:
他违背了设计模式里面的开闭原则(OCP),为什么呢?原因就是如果写出来的需求不够后续要求再添加的时候,那么就首先需要在实现接口,写出其他业余需求,然后在工厂类中添加相应实例化新的需求的功能(原因是简单模式的工厂方法他是用一个switch或者if判断实例化出具体的类),破坏了源代码。
####工厂方法模式:
在工厂类进行了改进,他是直接每一个类的实现对应一个(静态)方法,这样各个方法之间会不影响,不违背OCP原则。
####抽象工厂模式:
这种模式是直接个工厂变成接口,需要实现的类那就直接去实现一个工厂接口,也就是一个工厂对应一个类的实现,优点就在于灵活,代码扩展性强。唯一的缺点就是太重了,有点太大块了,一般的小功能用的话就有点小题大做了。
###三、反思
编程如果只是看源码,看题,看书,看视频,仅仅这样会毫无进步,要循循渐进,向老表学习,多总结,这样不但理解更加透彻而且记忆也更加牢固!