lombok中的builder注解本质上是为你生成了一个构造器Builder类,通过这个类我们可以构造出带此注解的对象。本质上它实现了设计模式中一种经典的模式:建造者模式
1.认识:
①一句话来说:封装一个复杂对象的构建过程,并可以按步骤构造。因为需要对对象一步步建造起来,所以称为建造者模式。
②将复杂产品的构建过程封装分解在不同的方法中,使得创建过程非常清晰,能够让我们更加精确的控制复杂产品对象的创建过程,同时它隔离了复杂产品对象的创建和使用,使得相同的创建过程能够创建不同的产品。但是若内部变化复杂,会有很多的建造类。
2.UML类图:
UML说明:Product(产品角色):一个具体的产品对象。Builder(抽象建造者):创建一个Product对象的各个部件指定的抽象接口。ConcreteBuilder(具体建造者):实现抽象接口,构建和装配各个部件。Director(指挥者):构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
3.代码如下:
1.产品类:
publicclassProduct{privateStringpart1;//可以是任意类型privateStringpart2;privateStringpart3;/**setget方法省略}
2.抽象建造者
publicabstractclassBuilder{Productproduct=newProduct();publicabstractvoidbuildPart1();publicabstractvoidbuildPart2();publicabstractvoidbuildPart3();publicProductgetResult(){returnproduct;};}
3.具体建造者
publicclassConcreteBuilderextendsBuilder{@OverridepublicvoidbuildPart1(){System.out.println("建造part1");}@OverridepublicvoidbuildPart2(){System.out.println("建造part2");}@OverridepublicvoidbuildPart3(){System.out.println("建造part3");}}
4.指挥者:
publicclassDirector{privateBuilderbuilder;publicDirector(Builderbuilder){this.builder=builder;}publicProductbuild(){builder.buildPart1();builder.buildPart2();builder.buildPart3();returnbuilder.getResult();}}
5.客户端
publicclassClient{@Testpublicvoidtest(){Builderbuilder=newConcreteBuilder();Directordirector=newDirector(builder);director.build();}}
6.执行结果
4.总结
优点:1、建造者独立,易扩展。将复杂产品的构建过程封装分解在不同的方法中,使得创建过程非常清晰,能够让我们更加精确的控制复杂产品对象的创建过程。
2、便于控制细节风险。它隔离了复杂产品对象的创建和使用,使得相同的创建过程能够创建不同的产品。
缺点:1、产品必须有共同点,范围有限制。
2、如内部变化复杂,会有很多的建造类,导致系统庞大。
应用场景1、需要生成的对象具有复杂的内部结构。2、需要生成的对象内部属性本身相互依赖。
5.应用场景
JAVA中的StringBuilder。
设计模式是一种解决问题的思维和方式,不要生搬硬套,为了设计模式而模式。
教程简介
正文
1、生活中的建造者模式
1、盖房子
我们在生活中盖房子,一般就是打地基,盖框架「用砖头或钢筋混凝土」,然后是粉刷。基本上就是这个路子。当然我们这些工作全部可以自己做,可也以找几个工人去干,当然还可以可以直接找一个设计师,直接说我就要这样的房子,然后就不管了,最后问设计师「设计师给一张纸给工人,工人就啪啪的干了」验收房子即可「至于你是如何建的过程我不关心,我只要结果」---这就是建造者模式
2、组装电脑
我们买的电脑都是由主板、内存、cpu、显卡等组成,如何把这些东西组装起来给用户这就是建造者模式的作用,不同的人对电脑的配置需求不一样的「打游戏的对显卡要求高」,但是电脑构成部件是固定的,我们找电脑城的装机人员把电脑装起来这一过程就是建造模式
3、软件开发
我们开发一款产品,需要技术主管、产品经理、苦逼的程序员。在这里,产品经理就是指挥者「Director」和客户沟通,了解产品需求,技术主管是抽象的建造者[Builder],让猿们杂做就杂做,而程序员就是体力劳动者「即具体的建造者,按照技术主管下发的任务去做」---这就是一个接近完美的建造者模式「为什么说接近呢?因为没有百分之百,靠:又忘记吃药了」
2、程序中的建造者模式
建造者模式的定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,这是官方定义,通俗的说就是:建造者模式就是如何一步步构建一个包含多个组成部件的对象,相同的构建过程可以创建不同的产品
建造者模式的特点
建造者模式是一种创建型模式,适用于那些流程固定「顺序不一定固定」,建造的目标对象会有所改变这种场景「比如画一条狗,这个目标不变,但是不同的是有黄狗,胖狗,瘦狗等」,还有一种场景是代替多参数构造器
建造者模式的作用
建造者模式的结构
建造者模式简单的UML
1、组装电脑
组装电脑简单的UML
根据UML撸码
/***CreatedbyTigerChain*产品类--被建造的对象*/publicclassComputer{privateStringcpu;//cpuprivateStringhardDisk;//硬盘privateStringmainBoard;//主板privateStringmemory;//内存...省略getter和setter}复制代码
/***CreatedbyTigerChain*抽象的建造者,即装电脑的步骤*至于安装什么型号的主板,不是我关心,而是具体的建造者关心的*/publicinterfaceBuilder{//安装主板voidcreateMainBoard(StringmainBoard);//安装cpuvoidcreateCpu(Stringcpu);//安装硬盘voidcreatehardDisk(StringhardDisk);//安装内存voidcreateMemory(Stringmemory);//组成电脑ComputercreateComputer();}复制代码
/***CreatedbyTigerChain*具体的建造者,这里是商场的一个装机人员*/publicclassAssemblerBuilderimplementsBuilder{privateComputercomputer=newComputer();@OverridepublicvoidcreateCpu(Stringcpu){computer.setCpu(cpu);}@OverridepublicvoidcreatehardDisk(StringhardDisk){computer.setHardDisk(hardDisk);}@OverridepublicvoidcreateMainBoard(StringmainBoard){computer.setMainBoard(mainBoard);}@OverridepublicvoidcreateMemory(Stringmemory){computer.setMemory(memory);}@OverridepublicComputercreateComputer(){returncomputer;}}复制代码
/***CreatedbyTigerChain*测试类*/publicclassTest{publicstaticvoidmain(Stringargs[]){ //装机员小美Builderbuilder=newAssemblerBuilder();//老板把小明的需求转给小美Direcrordirecror=newDirecror(builder);//老板最后拿到成品机子,工作全由小美去做Computercomputer=direcror.createComputer("Intel酷睿i97900X","三星M9T2TB(HN-M201RAD)","技嘉AORUSZ270X-Gaming7","科赋CrasII红灯16GBDDR43000");System.out.println("小明这台电脑使用的是:\n"+computer.getMainBoard()+"主板\n"+computer.getCpu()+"CPU\n"+computer.getHardDisk()+"硬盘\n"+computer.getMainBoard()+"内存\n");}}复制代码
怎么样,至于小张,小猪要装机把自己要的配置给老板即可,然后老板如何装机不用你管,你就等着收装好的机子吧
2、盖房子
盖房子的基本步骤和流程是固定的无非就是打地基、盖框架、然后浇筑「至于盖平房、还是楼房那是每个客户的具体需求」。总体来说盖房子以有以三种方式:
盖房子建造者模式简单的UML
/***CreatedbyTigerChain*最终的产品---房子*/publicclassHouse{//打地基privateStringfoundation;//盖框架privateStringframe;//浇筑privateStringpouring;...省略setter和getter}复制代码
publicinterfaceHouseBuilder{//打地基voiddoFoundation();//盖框架voiddoFrame();//浇灌voiddpPouring();//房子建成HousegetHouse();}复制代码
/***CreatedbyTigerChain*盖平房*/publicclassPingFangBuilderimplementsHouseBuilder{privateHousehouse=newHouse();@OverridepublicvoiddoFoundation(){house.setFoundation("盖平房的地基");}@OverridepublicvoiddoFrame(){house.setFrame("盖平房的框架");}@OverridepublicvoiddpPouring(){house.setPouring("盖平房不用浇灌,直接人工手刷就可以");}@OverridepublicHousegetHouse(){returnhouse;}}复制代码
/***CreatedbyTigerChain*盖楼房*/publicclassLouFangBuilderimplementsHouseBuilder{privateHousehouse=newHouse();@OverridepublicvoiddoFoundation(){house.setFoundation("盖楼房的地基就打十米深");}@OverridepublicvoiddoFrame(){house.setFrame("楼房的框架要使用非常坚固钢筋混凝土");}@OverridepublicvoiddpPouring(){house.setPouring("楼房拿个罐车把框架拿混凝土灌满即可");}@OverridepublicHousegetHouse(){returnhouse;}}复制代码
/***CreatedbyTigerChain*设计师*/publicclassHouseDirector{//指挥包工头publicvoidbuildHouse(HouseBuilderhouseBuilder){houseBuilder.doFoundation();houseBuilder.doFrame();houseBuilder.dpPouring();}}复制代码
我们对比了三种方式,自己盖房子,找工人盖房子,找设计师盖房子来逐步感受一下建造者模式的优点
可以看到最后一种最舒服,盖房子的时候直接外包给设计师自己就不用管了,到时候问设计师要建好的成品房子即可,这样对客户来说具体如何盖房子我不需要知道,屏蔽细节「只能说有钱就是任性」