第二部分:二十三种设计模式解读——什么是建造者方法模式

二十三种设计模式解读——什么是建造者方法模式

author:陈镇坤27

日期:2022年3月29日

更新日期:2022年7月8日

代码见专栏序言


——————————————————————————————

一、建造者方法模式

1、定义

Separate the construction of a complex object from its representation so that the same construction process can create different representations

将复杂对象的构建环节从其表示中分离出来,以便在同样的构建过程中,可以进行不同的表示。

怎么理解?

在调用端实例一个类a,然后对a进行字段的初始化,再真正意义上调用它。

实例a,字段初始化这些环节,就是对象构建的环节。

得到一个最终的目标实例,则是获得一个“表示”。

建造者方法模式可以帮助高层模块屏蔽实例的细节。将实例创建过程与实例本身进行解耦,可以利用同样的创建过程,创建不同的实例。

具体可以看下面的示例讲解

2、应用场景

原著作者解释大概是:

方法的执行顺序、不同的初始化效果等情况可灵活配置,并由此产生不同效果的类或方法;

但我不认同。旧的模板方法模式本就可以实现啊。

真正的应用场景,其实应该解释为:

屏蔽产品类的创建过程,解耦产品的创建流程和表示。让产品更容易拓展(调整属性时,采用了建造者模式的一个个调用端都不用去亲自初始化新属性)

比较多的应用在多个独立组件构建产品,实现不同功能的场景。

——————————————

2022年7月8日

1、对象的创建因配置的不同而执行效果不同时;

2、对象创建非常复杂;

3、对象创建过程中会使用到系统其它的对象时;

3、通用范本

实体类是产品。

建造者遵循开闭原则,由一个抽象类Builder约束一个或多个同族(同祖宗(则这里要求产品类隶属同一个族(父类)))产品的建造者。

有多个不同执行效果,相同构建过程的建造者可以用Director类来统一构建,对外暴露调用。

在这里插入图片描述

4、示例讲解

该示例建立在模板方法的基础上。对此不熟悉的可查看本专栏模板方法篇章。

现在要对新兵的训练计划做二次调整。

为了让场地充分利用,计划要求狙击手的各科训练顺序与其他兵种的训练顺序错开。并且以后也可能随时调整各兵种的训练顺序,要求执行人考虑到这一点。

为此,执行人在抽象产品类上新增了一个List作为sequence存储执行顺序。然后在模板方法上遍历sequence,通过if else判断哪些方法初始化。

在调用端Client,为了获得计划,指挥官竟然要看到构建计划的细节,并且还得了解如何具体构建,这让指挥官感到不悦——我要的是结果,你把过程这么详细告诉我?

执行人赶忙再次调整。

新增建造者,屏蔽了如何创建不同训练计划的过程。

然后执行人马上想到,只是这样还不够,指挥官还得手动输入执行顺序。不如直接再新增一个导演类,指挥官要哪些顺序提前告诉我,我提前准备,要是遇到没有准备好的,指挥官再手动输入执行顺序也不迟。

于是,最后的uml类图出来了:

在这里插入图片描述

简单看看调用端的一段代码

public static void main(String[] args) {
    //	原始计划
//        Sniper sniper = new Sniper();
//        ArrayList<String> list = new ArrayList<>();
//        list.add("creep");
//        list.add("squat");
//        sniper.setSequence(list);
//        sniper.startTraning();
  //	Builder计划
//        ArrayList<String> list = new ArrayList<>();
//        list.add("creep");
//        list.add("squat");
//        SniperBuilder sniperBuilder = new SniperBuilder();
//        sniperBuilder.setSequence(list);
//        AbstractSoldierTraning soldierTraningBuilder = sniperBuilder.getSoldierTraningBuilder();
//        soldierTraningBuilder.startTraning();
    //	Builder加director计划
        Director director = new Director();
        AbstractSoldierTraning sniper = director.getSniper();
        sniper.startTraning();
    }

5、拓展

6、总结

建造者方法模式,其实就可以理解成堆积木,你给出图纸来,我直接把成果给到你。并且告诉你,我这个成果的创建过程是可复用的,随你图纸的不同,我这边可以自适应地组合多个积木组件,迅速创建不同效果的积木结果。

放到生活中,汽车制造,计划等等,都可以应用建造者方法模式。

限制:产品必须有共性,不可能无节制地为某个单一的产品设计建造者模式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
设计模式是在软件设计过程中,对于常见问题的解决方案的总结和模板化的提炼。Java语言中广泛应用的设计模式有23,分为三个大类:创建型模式、结构型模式和行为型模式。 首先是创建型模式,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式建造者模式和原型模式。单例模式确保一个类只有一个实例化对象,简单工厂模式通过一个工厂类来创建对象,工厂方法模式通过使用工厂接口来创建对象,抽象工厂模式为一个产品族提供创建对象的接口,建造者模式逐步构建一个复杂对象,原型模式通过复制现有对象来创建新对象。 其次是结构型模式,包括适配器模式、桥接模式、装饰器模式、组合模式、外观模式、享元模式和代理模式。适配器模式用于将一个接口转换成客户端所期待的接口,桥接模式将抽象和实现解耦,装饰器模式动态地给对象添加额外职责,组合模式将对象组合成树形结构以表示“部分-整体”的层次结构,外观模式提供了一个简化客户端调用复杂子系统的接口,享元模式通过共享对象来有效地支持大量细粒度的对象,代理模式为其他对象提供一代理以控制对这个对象的访问。 最后是行为型模式,包括模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式和访问者模式。模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中实现,命令模式将请求封装成一个对象,以使不同的请求能够参数化客户端对象,迭代器模式提供一访问容器对象中各个元素的方式,观察者模式定义了对象之间的一对多依赖,中介者模式用一个中介对象来封装一系列对象的交互,备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,解释器模式给定一个语言,定义它的文法的一表示,并定义一个解释器,状态模式允许一个对象在其内部状态改变时改变它的行为,策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,以使得算法的变化不影响到使用算法的客户,访问者模式可以在不改变数据结构的前提下,定义作用于这个结构元素的新操作。通过使用这些设计模式,可以提高软件系统的可维护性、可扩展性和可重用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈镇坤27

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值