Java创建型设计模式之简单工厂,工厂方法,抽象工厂

在Java的23中设计模式中,其中有创建型的一类创建模式,通常用来抽象封装创建对象来使用的,这一类创建模式是使得客户端调用者不用关心对象是如何创建,统统交给一个叫做“工厂”的对象来创建对应的对象。这样就能做到客户端不与想要创建的对象紧密地耦合,降低耦合度。

1.简单工厂

简单工厂具体来并不属于Java中的23种设计模式中之一,它只是一种对创建对象的简单的封装,只需要传入一个正确的参数,就可以得到获取你所需要的对象。简单工厂比较适合用于那些创建类比较少的场合,以及客户端只知道传入工厂类的参数即可,对于如何创建对象并不关心。

下面我们来看看简单工厂的实例:

 我们这里的例子场景是我们此时需要开发一个在线学习的系统平台,里面可以学习Java,Python,算法,前端等等课程,对于每一个课程我们都要去录制相应的视频,每一个课程录制步骤都不一样,那么此时我们可以使用简单工厂去创建不同的课程对象来调用录制视频的方法。

首先我们要定义一个Video抽象类,来抽象出Video对象,每一个课程对象都继承与Video对象

创建不同的课程对象

创建一个简单工厂类,这个类负责不同的课程对象的创建,里面的create方法根据不同的参数进行对应对象的创建

客户端调用就可以直接创建简单工厂的实例,然后传入你想创建的对象的参数它就可以帮你创建你想要的对象。

Idea中UML类图:

简单工厂的总结:简单工厂封装了对象创建的过程,使得我们调用方不直接依赖与需要创建的对象,我们也不用关心该对象是怎么创建的,我们只需要告诉工厂类我们需要哪个对象,这样工厂类就能帮我们创建并且返回给我们了。但是简单工厂的缺点也显而易见,就是当我们需要创建的对象越来越多的时候,工厂类里面的create方法的if分支就会越来越多,这样会造成代码可读性越来越差,这样也违背了设计原则中的开闭原则,所以说简单工厂适用于创建对象比较少的场合。

2.工厂方法

工厂方法是属于Java的23中设计模式之一的。我们可以知道简单方法的缺点在于当我们需要创建的对象越来越多的时候,工厂类的职责会越来越重,那么我们是否可以相对于不同的产品等级分为不同的工厂方法来创建不同的对象尼?

我们可以把不同的课程视频对象分别对应于不同的工厂类创建,这样就不存在于与简单工厂中随着创建的对象的增多工厂类的职责越来越重,以及修改原本工厂类创建对象的逻辑代码了,也符合了开闭原则。比如这里我们要新增加一个前端的课程,那么利用工厂方法模式我们只需要新建一个前端课程视频的工厂类来负责前端课程视频对象的创建就行了。 

创建一个工厂抽象类,里面的抽象方法就是用来创建视频对象的

创建不同课程视频的工厂对象

客户端调用,这样当我们想要创建Java的课程视频对象的时候尼我们只需要创建出Java课程视频的工厂对象就行了,而我们想要新增一个前端的课程的话,就继承VideoFactory对象创建出前端的课程视频工厂类,在这个工厂里面去创建前端课程视频对象。

Idea中的UML类图:

工厂方法的总结:使用工厂方法可以解决掉简单工厂随着需要创建的对象越来越多而导致不断修改工厂类中创建对象的逻辑,从而违背了开闭原则的问题。当我们的需求需要新增一个类的时候,我们可以不用去修改原有的代码,新增一个对应的工厂类负责这个新增的类的创建就行了,这样方便了在原有代码的基础上进行拓展,符合开闭原则的规定。

3.抽象工厂

抽象工厂和工厂方法其实很像,不过尼对于抽象工厂模式的工厂来说,每一个工厂负责的是每一个产品族的创建,什么是产品族,在说到产品族就会有一个产品等级的概念想对应,举个例子,电商系统我们在里面想要上架美的的空调,美的的冰箱,海尔的空调,海尔的冰箱,那么对于美的这个品牌来说,美的的空调,美的的冰箱就相当于一个产品族,都是属于美的的,同理,海尔的空调,海尔的冰箱也是一个产品族,都是属于海尔的。而美的的冰箱,海尔的冰箱就两者都同属于一个产品等级(都是冰箱)。所以产品族和产品等级是相对于不同角度去归类的,产品族里面都是不同类型的产品但同属于一个系列的集合,产品等级是不同系列中的同类型的集合。那么抽象工厂就是针对产品族而言去创建产品族对象的。

这时候我们的系统多了一个需求就是每一个课程都要有视频+笔记才能称得上是一个完整的课程,而我们此时每一个课程只有视频,所以我们就要创建一个课程笔记的类。

对应的工厂类就应该有课程的视频对象和课程的笔记对象,因为对于Java这个课程来说,Java的视频和Java的笔记就是一组产品族。

创建抽象工厂类

创建Java课程的产品族工厂类

客户端调用

抽象工厂UML类图:

抽象工厂的总结:抽象工厂是针对于产品族而言的,而工厂方法是针对于产品等级而言的,这是两者最大的区别。抽象工厂能将一个系列的产品族统一到一个工厂类去创建,使得具体产品族在应用层代码隔离,无须关心创建细节。但是抽象工厂的缺点也很明显的,就是当我们想对这个产品族进行产品扩展的时候,我们不得不去修改抽象工厂中的抽象方法,这样就违背了开闭原则,所以说并不是所有的设计模式都严格遵守于设计原则的。如果我们的需求不是经常变更的话,那么使用抽象工厂模式也是利大于弊的。

猜你喜欢

转载自blog.csdn.net/weixin_37689658/article/details/94362216