java 设计模式-工厂模式

hl.wang

发布于 2019.08.22 13:50 阅读 2686 评论 0

什么是工厂模式?

       用工厂方法代替了new操作, 将选择实现类,创建对象统一管理和控制.从而将调用者(Client)与实现类进行解耦.实现了创建者与调用者分离

 

 

为什么要使用工厂模式?

       工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

 

 

 

情景案例

       当我们在买车的时候,我们可以买宝马车,也可以买奔驰车,我们只需要跟销售员说一声我们需要什么车,销售员就可以把我们需要的车给我们,我们无需去关注这个车是如何生产的是如何制造的,使用什么制造的,这就是典型的工厂模式的案例,我们下面来看一下如何使用工厂模式实现它。

 

 

 

 

 

工厂模式-简单工厂模式

     首先宝马和奔驰因为都是车,车是他们共同的特征,因此我们用一个接口来表示车。

然后我们分别创建宝马车和奔驰车,都需要实现这个车的接口

      现在车我们已经创建好了,那么如何生产车呢?直接new吗?当然不是,我们需要建一个工厂来生产这些车

现在工厂也有了,车也有了,我们来测试一下吧

 

 

 

 

       通过上面的简单工厂模式我们发现,如果我们突然要增加一个奥迪车怎么办,那样我们需要修改工厂类里的if判断在增加 一个奥迪车的判断,这样违反了开闭原则,因此我们开始使用工厂模式,同样还是这个案例,我们来看看如何使用工厂模式来实现它

 

 

       创建车的步骤和简单工厂模式是一样的,区别是在创建工厂时不一样,下面我们来看一下如何工厂模式的工厂是如何编写的

 首先这里不再是工厂类了而是一个工厂接口

 

 

下面我们有宝马车的时候我们就创建一个宝马车的工厂用来专门生产宝马车

奔驰车我们就创建一个奔驰车的工厂来专门生产奔驰车

现在车和工厂创建好了,我们来测试一下吧

 

       我们发现实现的效果是一样的,但是区别是什么呢,如果我们现在增加了一辆奥迪车,我们无需修改之前的代码,只需要新建一个奥迪车的工厂就可以了,增加了我们代码的可扩展性,并且也符合了开闭原则。

 

 

 

 

       通过我们了解工厂模式发现,工厂模式还是存在一些问题,如果我们生产宝马的工厂刚好还生产飞机呢,如果飞机又有好多种呢,我们是不是又需要好多个工厂,这样当我们的产品有很多的时候,就会造成有很多的类,内存过大,那么我们如何优化这种情况呢,因此我们又引进了抽象工厂模式,下面我们来看一下抽象工厂模式是如何来优化工厂模式中存在的问题的。

 

 

 

       创建工厂之前的方式依旧是一样的我们就不重复了,抽象工厂和工厂模式的区别就是一个工厂不在生产单一的产品,我们来看一下如何创建工厂

 

 

      下面如果我们的奔驰厂家不仅仅生产奔驰,还生产宇宙飞船,宝马厂家不仅生产宝马,还生产战斗机,用抽象工厂模式我们只需要两个工厂宝马厂家工厂,奔驰厂家工厂,但是如果是工厂模式我们就需要创建宝马工厂,奔驰工厂,战斗机工厂,宇宙飞船工厂,那如果宝马厂家还有其他的产品呢?是不是在工厂模式中依然需要创建新的工厂,而在抽象工厂模式中还是只需要两个工厂就可以了,下面我们继续

这是奔驰工厂,主要生产奔驰车和宇宙飞船

 

 

 

这是宝马工厂,主要生产宝马车和战斗机

 

 

 

 

 

工厂建好了我们下面来测试一下

 

但是我们发现抽象工厂模式也有缺点,比如我们不仅有飞机、骑车还有自行车呢?这样我们无法新增,因此每一种模式各有优缺点,根据实际情况选择不同的工厂模式来使用

 

 

 

 

 

 

 

总结

简单工厂模式:用来生成同一等级结构中的任意产品,对于增加新的产品,需要修改已有代码

工厂模式:用来生成同一等级结构的固定产品, 支持增加任意产品

抽象工厂模式:用来生产不同产品族的全部产品, 对于增加新的产品无能为力