简单工厂设计模式和工厂方法设计模式

简单工厂设计模式

不论学习哪一个设计模式,都要知道设计模式可以给我们带来哪些好处,以及我们为什么要学习设计模式。

根据老师教导以及个人的片面经验,我认为使用设计模式的目的是 : 增强代码的复用性以及可维护性。

可维护性就是以后是否方便扩展,增加了新的需求的话,代码是否好改,会不会出现非常难处理的问题,比如说代码没有很好地复用,构建一个对象的过程写到了很多不同的类中,如果要修改构建过程的话,要全部修改,如果少改了一个地方就可能出现bug

所有的设计模式都是用来解决实际问题的,为了引入简单工厂设计模式,我们模拟一个需求:

需求:写植物大战僵尸中的一个功能,玩家可以拖动任意一个植物到任意一个空地上然后开始战斗。

假设目前只有三种植物——豌豆射手,冰豆射手,坚果。

实现该需求
    1.写三个类,分别表示需求中的三种植物,每个类都有两个方法,一个是获取该类植物的名字,另一个是打印出该类植物的战斗方式。
    2.再写一个方法类,让这个类负责完成拖动植物到空地的工作,需要两个参数:植物名称和要放到的目的地。根据名称判断要new哪个植物,然后执行移动,然后执行战斗方法。

下面给的实现方式,默认已经建立了三个满足需求的植物类。【前提】

一.最简单最无脑的实现方式,直接用if else实现

 

这样写的缺点是:重复代码太多,每个if块中都有System.out.println("……………………"); ,如果需要在放置后添加战斗方法的话,每个if块中全部都要加上战斗方法,更是显得重复了,非常不方便以后修改。

怎么样能让代码不这么重复呢?答案是把生成对象的逻辑和执行业务的逻辑区分开来,如下图

想要写成这个样子,需要抽取出一个接口,Planet,让三种植物都实现Planet接口即可。

上面的实现可以满足暂时的需求,可是如果有很多地方都有生成对象的需要,把所有需要生成对象的地方都写一遍上面的代码,是不合理的,抽取出来大家一起用,就显得合理又方便。

建立一个生成植物的工厂类

在任何需要生成植物对象的地方如下方式使用即可

这就是简单工厂设计模式,有的时候设计项目根本没有往设计模式上想,就自己想着怎么样能把项目设计的更加好,等到设计完成后发现自己写的原来和某某设计模式很相似,设计模式是前人总结好的经验,与其自己花大把时间琢磨试错,不如好好学学前人经验,在其基础上添砖加瓦使得设计模式更加好用!

为了实现代码复用性,增加可维护性,我们让我们的代码尽量的符合设计原则,自己能写出符合设计原则的代码也很好,设计模式是一些固定的套路,帮助我们更加简单的实现符合设计原则的代码。

每一个植物有自己的工厂类可以生产对应的植物,抽取出来一个植物工厂接口,所有的植物工厂类都要实现植物工厂接口,用一个简单工厂设计模式写一个返回植物工厂类的方法,根据植物名称或者其他信息返回对应的植物工厂类。好处:如果添加了新的植物,只需要建立一个对应的工厂类去实现植物工厂接口,然后在简单工厂中添加一个if else即可,新增植物不需要修改源码。

工厂方法设计模式

给每一个植物添加一个工厂类,抽取出来一个植物工厂接口,一个使用简单工厂设计模式的builder类用来根据植物名或者完整类路径获取对应的工厂。

简单工厂设计模式和工厂方法设计模式的差距:

1.如果构建对象的过程比较复杂,简单工厂设计模式无法使用反射来创建对象。工厂方法设计模式可以使用反射来创建工厂。

2.所有的构建方法都在同一个方法中,代码会过长,臃肿容易出问题,不好排查。工厂方法设计模式都给拆分了,不臃肿。

3.如果要想复用代码的话,需要和简单工厂中生产的植物一模一样,不一样的话不能实现复用。工厂方法设计模式下如果要增加新植物,或者修改植物,只需要增加一个实现了工厂接口的工厂类。

工厂方法

猜你喜欢

转载自blog.csdn.net/hcrw01/article/details/83278918