设计模式之工厂模式

工厂模式(Factory Pattern)是开发中比较常用的设计模式之一。这种类型的设计模式属于创建型模式(关于创建型模式的概念,可以参考 设计模式概念与简介 ,简单点理解就是创建对象的模式,比如使用频率最高的单例模式就是创建型模式的一种)。其中工厂模式仔细区分的话,可以分为三种,分别是简单工厂模式、工厂方法模式以及抽象工厂模式(后面的两种模式都是基于第一种模式进行的),本篇文章主要学习的是简单工厂模式(简单工厂模式一般称之为工厂模式)

什么是工厂模式?

我们在创建对象时不会对客户端直接暴露创建逻辑,而是 通过使用一个共同的接口根据不同的条件来指向具体想要创建的对象。

为什么要使用工厂模式?

比如,我现在想要去英雄商城购买英雄(去商场买衣服、去餐馆吃饭也是同样的道理),首先每个英雄要耗费的金币不一样,姑且我不管这个英雄是怎么设计的,只需交付不同的钱,购买不同的英雄即可。不同的钱,购买不同的英雄在代码层面上理解就是,在不同的条件下创建不同的实例对象。(注意:这个不同的条件是外部调用的)那么我现在只要交付具体的钱(也就是区分不同的条件)即可从商城(也就是工厂)获取我想要的英雄。

工厂模式的优点?

A:使用工厂模式的优点在于一个调用者想创建一个对象,只要知道其名称(也就是不同的标签)就可以在工厂获取具体的对象

B:扩展性强,如果想增加一个产品(也就是具体的对象),只要扩展工厂类就可以(也就是增加不同的标签,增加不同标签所对应的对象)。

C: 屏蔽产品的具体实现,调用者只关心产品的接口、无需关心内部实现。

开始编码:

首先,根据上面提到的场景,我们知道所有的联盟英雄都有被购买的权利和使用技能的义务,那么,我们定义一个接口让所有在商城内的英雄都遵循这个行为规范,于是就有了下面的代码:

设计模式之工厂模式

英雄的行为规范

那么,有了这个英雄的行为规范,就可以定义具体的英雄了(也就是实现Heros接口的子类)

设计模式之工厂模式

艾希

设计模式之工厂模式

易大师

设计模式之工厂模式

提莫

上面一口气定义了三个英雄,定义完英雄以后,下面就可以开始我们的工厂模式核心了。

既然是工厂模式,那么这个工厂我们可以这样理解:在一个地方统一管理产品,但是这些生产的产品肯定有不同的标签(一般是ID)来区分产品是那一条生产线的。如果不区分产品那如果出了问题也难以快速定位。那么,这个不同的标签在代码中该如何实现,简单点思考就是字符串或者数字等等的不同,于是乎,我们就有了下面的代码:

设计模式之工厂模式

工厂模式

红色矩形代表的就是:上面说到的 “ 不同的标签 ”

蓝色矩形代表的就是:根据不同的标签,返回不同的子类对象(因为这些对象都实现了Heros接口)

写完这个工厂类以后,我们就可以使用这个工厂类进行测试了:

设计模式之工厂模式

测试工厂类

测试结果如下:

设计模式之工厂模式

测试结果

工厂模式的内容和使用基本就结束了。上面说到,简单工厂模式是工厂方法模式和抽象工厂模式的基础,后续的博文也会推出这两篇文章:

工厂方法模式

总结:

个人对工厂模式的理解就一句话:我们不生产水,我们只是大自然的搬运工。

因为生产水的细节隐藏在内部实现,所以我们不用管;大自然,就可以理解为这里提到的工厂;搬运工,就可以理解在工厂里面根据不同的标签去获取实例对象。