文章预览:
一、工厂模式
1、介绍
这种设计模式也是 Java 开发中最常⻅的⼀种模式,又称工厂方法模式,简单说 在工厂类中提供⼀个创建对象的⽅法, 允许实际调用类决定实例化对象的类型。就是为了提供代码结构的扩展性,屏蔽每⼀个功能类中的具体实现逻辑。让外部可以更加简单的只是知道调⽤即可,同时,这也是去掉众多 ifelse 的⽅式。当然这可能也有⼀些缺点,⽐如需要实现的类⾮常多,如何去维护,怎样减低开发成本。但这些问题都可以在后续的设计模式结合使⽤中,逐步降低。
2、实例
(1)、典型的工厂模式
以一个生产男鞋和女鞋的工厂为例:
工厂类和生产者接口:
男鞋和女鞋的实现类:
实际调用类:
输出结果:
生产男鞋
生产女鞋
进程已结束,退出代码为 0
(2)、多个工厂方法模式
与典型的工厂模式对比,Factory2将每个子类实例返回封装成单独的方法
这也使得在实际调用中通过调用单独不同的方法即可得到实例:这样做的好处是不必关心触发某个实例创建的逻辑,只需要调用创建某个实例的专有方法即可。
(3)、静态工厂方法模式
将上面的多个工厂方法模式里的方法置为静态的,使得工厂类不需要创建实例,直接调用即可。
3、总结
看完你可能会觉得,只是判断男鞋或女鞋从而觉得输出语句业务,仅此而已。但是随着业务逻辑的增加,不同业务类型决定各种各样的逻辑功能时,事情也没有那么简单。比如若工厂实现的实例越来越多,而且实例间的相关性大大降低,这就凸显了工厂模式的重要性,充分发挥出其避免创建者与具体的产品逻辑耦合 、 满⾜单⼀职责,每⼀个业务逻辑实现都在所属⾃⼰的类中完成 、 满⾜开闭原则,⽆需更改使⽤调⽤⽅就可以在程序中引⼊新的产品类型的优点。
但这样也会带来⼀些问题,⽐如有⾮常多的奖品类型,那么实现的⼦类会极速扩张。因此也需要使⽤其他的模式进⾏优化,这些在后续的设计模式中会逐步涉及到。从案例⼊⼿看设计模式往往要⽐看理论学的更加容易,因为案例是缩短理论到上⼿的最佳⽅式,如果你已经有所收获,⼀定要去尝试实操。
二、抽象工厂模式
1、介绍
抽象工厂模式其实就是在工厂模式的基础上又添加了一层“工厂的工厂”。上述的工厂方法模式有一个问题就是,类的创建十分依赖工厂类,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
2、实例
仍然以男鞋女鞋工厂为例,与上面不同的是,该模式将“一个工厂生产两种鞋”的业务变成了两个工厂各自生产一种鞋。
两个产品:
两个工厂:
测试:
3、实例拓展
以搭建Redis集群A、B为例:
可以预⻅的问题会有:
- 很多服务⽤到了Redis需要⼀起升级到集群。
- 需要兼容集群A和集群B,便于后续的灾备。
- 两套集群提供的接⼝和⽅法各有差异,需要做适配。
- 不能影响到⽬前正常运⾏的系统。
采⽤代理类的⽅式创建和获取抽象工厂,所被代理的类就是Redis操作⽅法类,让这个类在不需要任何修改下,就可以实现调⽤集群A和集群B的数据服务。
由于集群A和集群B在部分⽅法提供上是不同的,因此需要做⼀个接⼝适配(ICacheAdapter),⽽这个适配类就相当于⼯⼚中的⼯⼚,工厂A类和工厂B类实现了该适配接口,并且实现其方法。⽤于创建把不同的服务抽象为统⼀的接⼝做相同的业务。
4、总结
好处就是,如果你现在想增加一个功能:生产男鞋和女鞋以外的鞋,虽然这似乎不符合伦理道德,但实际业务可能就是需要实现。那么只需创建一个产品实现类,实现Product接口,同时创建一个工厂类,实现Producer接口就OK了,无需去改动现成的代码。那么这个设计模式满⾜了:单⼀职责、开闭原则、解耦等优点
但如果说随着业务的不断拓展,可能会造成类实现上的复杂度。但也可以说算不上缺点,因为可以随着其他设计⽅式的引⼊和代理类以及⾃动⽣成加载的⽅式降低此项缺点。
三、建造者模式
1、介绍
建造者模式主要解决的问题是在软件系统中,有时候⾯临着"⼀个复杂对象"(鞋)的创建⼯作,其通常由各个部分的⼦对象⽤⼀定的过程构成;由于需求的变化,这个复杂对象的各个部分经常⾯临着重⼤的变化,但是将它们组合在⼀起(Builder)的过程却相对稳定。
这⾥我们会把构建的过程交给 创建者 类,⽽创建者通过使⽤我们的 构建⼯具包 ,去构建出不同的生产方案。
2、实例
仍然是生产产品接口及其实现类:
建造者类发出命令分别生产3双男鞋和2双女鞋:
测试结果:
生产男鞋
生产男鞋
生产男鞋
生产女鞋
生产女鞋
进程已结束,退出代码为 0
3、实例拓展
现在我们在一个选择装修套餐(豪华欧式、轻奢⽥园、现代简约三种)的场景下,利用建造者结合各种物料以及物料品牌做出构建方案。
DecorationPackageMenu类通过实现IMenu接口,将不同的物料构建方法封装进来,对外开放的参数只需要Builder将物料及品牌扔进去,让DecorationPackageMenu处理后返回IMenu即可。
4、总结
建造者模式将很多功能集成到一个类里,这个类可以创造出比较复杂的东西。所以与工厂模式的区别就是:工厂模式关注的是创建单个产品,而建造者模式则关注创建符合对象,多个部分。通过上⾯对建造者模式的使⽤,已经可以摸索出⼀点⼼得。那就是什么时候会选择这样的设计模式,当: ⼀些基本物料不会变,⽽其组合经常变化的时候 ,就可以选择这样的设计模式来构建代码。此设计模式满⾜了单⼀职责原则以及可复⽤的技术、建造者独⽴、易扩展、便于控制细节⻛险。
但同时当出现特别多的物料以及很多的组合后,类的不断扩展也会造成难以维护的问题。但这种设计结构模型可以把᯿复的内容抽象到数据库中,按照需要配置。这样就可以减少代码中⼤量的重复。
四、原型模式
1、介绍
该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。本小结会通过对象的复制,进行讲解。
2、实例
在Java中,复制对象是通过clone()实现的,先创建一个原型类:
public class Prototype implements Cloneable {
public Object clone() throws CloneNotSupportedException {