设计模式之死磕工厂模式(原创)-阿里云开发者社区

开发者社区> 开发与运维> 正文

设计模式之死磕工厂模式(原创)

简介: 工厂模式(Factory Pattern)是开发中比较常用的设计模式之一。这种类型的设计模式属于创建型模式(关于创建型模式的概念,可以参考 设计模式概念与简介 ,简单点理解就是创建对象的模式,比如使用频率最高的单例模式就是创建型模式的一种)。

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

什么是工厂模式?

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

为什么要使用工厂模式?

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

工厂模式的优点?

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

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

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

开始编码:

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

img_d962da35a104057f30019e28f7fb154a.png
英雄的行为规范

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

img_59ab96a4cd6174832db056a2356ebe76.png
艾希
img_a0d208316584578e6eae9567aef64f89.png
易大师
img_d2c96cdd6d7898488bf7d40ce6abec63.png
提莫

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

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

img_fcadeae588ee7ca4c16c9a78ed2d40b5.png
工厂模式

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

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

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

img_8e325e3055b4e9e499023b703e2cdb86.png
测试工厂类

测试结果如下:

img_38d4f953468d1d49684bd648d0f60523.png
测试结果

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

工厂方法模式

总结:

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

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

如果这篇文章对你有帮助,希望各位看官留下宝贵的star,谢谢。

Ps:著作权归作者所有,转载请注明作者, 商业转载请联系作者获得授权,非商业转载请注明出处(开头或结尾请添加转载出处,添加原文url地址),文章请勿滥用,也希望大家尊重笔者的劳动成果。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章