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

本文介绍了建造者模式,通过将复杂对象的构建与表示分离,实现创建过程的灵活性和产品的多样性。适用于对象创建因配置不同而效果各异、创建复杂或依赖其他对象的场景。通过示例展示了如何在训练计划调整中应用建造者模式,以提高代码的可维护性和扩展性。
摘要由CSDN通过智能技术生成

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

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、总结

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈镇坤27

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

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

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

打赏作者

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

抵扣说明:

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

余额充值