当前位置: 首页 > 后端技术 > Java

lombok中的builder注解其实是一种设计模式:让我们了解超实用的“builder模式”_0

时间:2023-04-01 16:24:11 Java

lombok中的builder注解本质上是为你生成一个构造函数Builder类。可以构造具有此注释的对象。本质上,它实现了设计模式中的一个经典模式:建造者模式1、认识:①一句话:封装了一个复杂对象的构造过程,可以一步步构造。由于对象需要一步步构建,所以称为构建器模式。②将复杂产品的构建过程封装分解成不同的方法,使得创建过程非常清晰,让我们能够更加精准地控制复杂产品对象的创建过程。同时,它隔离了复杂产品对象的创建和使用,使得同一个创建过程可以创建不同的产品。但是如果内部变化比较复杂,那么构造类就会很多。2.UML类图:UML描述:Product(产品角色):具体的产品对象。Builder(抽象构建器):创建一个由Product对象的每个组件指定的抽象接口。ConcreteBuilder(具体构建器):实现抽象接口,构建和组装各种组件。Director:使用Builder接口构造一个对象。它主要用于创建一个复杂的对象。它主要有两个作用,一是隔离客户和对象的生产过程,二是负责控制产品对象的生产过程。3、代码如下:1、Product类:publicclassProduct{privateStringpart1;//可以是任意类型privateStringpart2;私有字符串第3部分;/**setget方法省略}2.AbstractbuilderpublicabstractclassBuilder{Productproduct=newProduct();公共抽象无效buildPart1();公共抽象无效buildPart2();公共抽象无效buildPart3();publicProductgetResult(){返回产品;};}3.实体构建者publicclassConcreteBuilderextendsBuilder{@OverridepublicvoidbuildPart1(){System.out.println("Buildpart1");}@OverridepublicvoidbuildPart2(){System.out.println("Buildpart2");){System.out.println("构建第3部分");}}4.指挥官:publicclassDirector{privateBuilderbuilder;publicDirector(Builderbuilder){this.builder=builder;}derbuildpublicProductbuild(){.buildPart1();builder.buildPart2();builder.buildPart3();返回构建der.getResult();}}5.ClientpublicclassClient{@Testpublicvoidtest(){Builderbuilder=newConcreteBuilder();Directordirector=newDirector(builder);director.build()};6.执行结果4.总结优点:1.构建器独立,易于扩展。将复杂产品的构建过程封装和分解成不同的方法,使得创建过程非常清晰,让我们能够更精准地控制复杂产品对象的创建过程。.2、细节风险易于控制。它将复杂产品对象的创建和使用隔离开来,使得相同的创建过程可以创建不同的产品。缺点:1.产品必须有共同点,范围有限。2、内部变化复杂,构造类型多,系统庞大。应用场景1.待生成对象具有复杂的内部结构。2、需要生成的对象内部属性相互依赖。5、JAVA应用场景中的StringBuilder。第六,我个人理解设计模式是一种思维方式和解决问题的方法。不要生搬硬套,为了设计模式而做模式。PS:转载请注明出处作者:TigerChain地址:www.jianshu.com/p/300cbb9ee...本文来自TigerChain简书人人会设计模式教程介绍1.ReadingObjects本教程适合初学者,老手可以直接跳过2。教程难度初级,本人水平有限。文章内容难免会出现问题。如有问题请指出,谢谢3.Demo地址:github.com/githubchen0...正文1.什么是建造者模式1.生活中的建造者模式1.盖房子当我们盖房子的时候我们日常生活中的房子,通常是打地基,“用砖或钢筋混凝土”搭起框架,然后粉刷。基本上就是这样。当然,这些工作我们可以自己做,也可以找几个工人来做。当然,我们也可以直接找设计师,就说我想要这样的房子,然后就不管了,最后请设计师“设计师给工人一张纸,工人会用一张砰。”只接受房子。“我不在乎你是如何构建过程的,我只想要结果。”---这就是建造者模式2.组装我们买的电脑电脑是由主板、内存、cpu、显卡等组成的,如何为用户组装这些东西就是建造者模式的功能。不同的人对电脑配置有不同的要求。“玩游戏对显卡的要求很高。”,但计算机的组件是固定的。我们在电脑城找安装师傅安装电脑。这个过程就是构建模式3.软件开发我们开发一个产品,需要技术主管,产品经理,还有吃苦耐劳的程序员。在这里,产品经理是与客户沟通、了解产品需求的指挥官“Director”,技术主管是抽象建造者[Builder],让猿猴干活,程序员是“体力劳动者”,即,具体的Builder,按照技术主管分配的任务”---这是一个近乎完美的Builder模型。模式Builder模式的定义将复杂对象的构建与其表示分离,使得同一个构建过程可以createdifferentrepresentations.这是官方的定义.通俗地说:建造者模式就是如何一步一步建造一个复杂的物体.同样的建造过程可以创造出不同的产品.建造者模式的特点.建造者模式是一种创造模式,适用于流程固定“顺序不一定固定”,构建的目标对象会发生变化的场景,这种场景“比如画一只狗,目标不变,但有区别就是有黄狗,胖狗,瘦狗等等。”,还有一个场景替代了多参数构造函数构建器模式1,用户不知道对象的构造过程和细节可以创建一个复杂对象“屏蔽了构建的具体细节”2.用户只需要给出复杂对象的内容和类型就可以创建该对象3.建造者模型按照流程一步步创建的结构角色类别复杂对象生成器模式解释了生成器接口或抽象类。抽象生成器不是必需的。ConcreateBuilder。混凝土建造者可以有多个“因为每个建筑风格可能不同”。产品普通类具体产品“要构建的对象”。导演又叫指挥员指挥建造者建造靶子。导演不是必须的。构建器模式是简单的UML。二、建造者模式举例1、组装电脑小明想组装一台台式电脑。小明对电脑配置一窍不通,就直接跑到电脑城跟安装老板说,我想要一台非常适合玩游戏的电脑,请安装“请推荐配置”,于是老板让员工“小梅”按照小明的要求安装了一台性能不佳的电脑。一个小时后,电脑安装好了,小明付了电脑款就离开了。过了一会儿,小张又来了,要了一台可以用来写文章的电脑。老板根据小张的要求,给了不同的配置。不同的人有不同的配置方案“但安装过程是一样的”,这是典型的组装计算机的建造者模式SimpleUML基于UML代码1、创建待建造的对象计算机---Computer.java/***由TigerChain创建*Productclass--要构建的对象*/publicclassComputer{privateStringcpu;//cpuprivateStringhardDisk;//硬盘privateStringmainBoard;//主板私有字符串内存;//记忆。..省略getter和setter}复制代码2.Abstractbuilder---Builder.java/***由TigerChain创建*Abstractbuilder,即安装电脑的步骤*至于安装的主板类型,我不知道不关心,具体builder关心*/publicinterfaceBuilder{//安装主板voidcreateMainBoard(StringmainBoard);//安装cpuvoidcreateCpu(Stringcpu);//安装硬盘voidcreatehardDisk(StringhardDisk);//安装内存voidcreateMemory(Stringmemory);//组装一台电脑ComputercreateComputer();}复制代码3.具体的builder,也就是安装器小美---AssemblerBuilder.java/***由TigerChain创建*具体搭建或者,这里是商城的安装器*/publicclassAssemblerBuilderimplementsBuilder{privateComputercomputer=newComputer();@OverridepublicvoidcreateCpu(Stringcpu){计算r.setCpu(cpu);}@OverridepublicvoidcreatehardDisk(StringhardDisk){computer.setHardDisk(hardDisk);}@OverridepublicvoidcreateMainBoard(StringmainBoard){computer.setMainBoard(mainBoard);}@OverridepublicvoidcreateMemory(Stringmemory){computer.setMemory(memory);}@OverridepublicComputercreateComputer(){返回计算机;}}复制代码4.还有老大“指指点点”安排安装程序的工作---Direcror.java/***TigerChainCreated*声明一个director类“director,thedirector”bosswhocaninstallthecomputerhere”,用于指导组装过程,即组装电脑的过程*/publicclassDirector{privateBuilderbuilder;//使用多态,安装器有很多,我关心你小美,小兰,小猪,我都收集了publicDirecror(Builderbuilder){this.builder=builder;}//老板只??想看到最后的成品---交给客户publicComputercreateComputer(Stringcpu,StringhardDisk,StringmainBoard,Stringmemory){//具体工作是为安装程序执行此操作。builder.createMainBoard(mainBoard);this.builder.createCpu(cpu);this.builder.createMemor是(内存);this.builder.createhardDisk(硬盘);返回this.builder.createComputer();}}CopyCode5,测试类/***TigerChain*测试类*/publicclassTest{publicstaticvoidmain(Stringargs[]){//安装小梅生成器builder=newAssemblerBuilder();//老板把小明的需求转给小美Direcrordirecror=newDirecror(builder);//老板终于拿到成品机了,工作全部由小美电脑完成computer=direcror.createComputer("IntelCorei97900X","SamsungM9T2TB(HN-M201RAD)","GigabyteAORUSZ270X-Gaming7""KefuCrasII红光16GBDDR43000");System.out.println("小明使用这台电脑:\n"+computer.getMainBoard()+"主板\n"+computer.getCpu()+"CPU\n"+computer.getHardDisk()+"硬盘\n"+computer.getMainBoard()+"内存\n");}}复制代码6.运行查看结果怎么样?就老板,然后你就不用管老板怎么装机了,你就等着装机就行了。2、建房的基本步骤和流程是固定的,或者一座建筑,那是每个客户的具体需求。”一般来说,盖房子有三种方式:1.自己盖房子“没办法,有的人牛逼,自己设计,自己动手,当然这是小房子,你让我盖a32-storyhouseformetoseeLook”2.想要盖房子的人是承包商。他找了一群工人自己修房子。3.想要盖房子的人是一个什么都不懂的普通人。找设计师说“我要盖房子,南北通透,四美常春”。设计师说没问题。设计师把设计好的图纸丢给承包商说:“就这样建吧。”承包商拿到图纸并在工人之间分工。发工,终于把房子盖好。建造者模型简单UML根据UML代码1,房屋对象House.java/***由TigerChain创建*最终产品---house*/publicclassHouse{//打基础privateStringfoundation;//覆盖框架privateStringframe;//pourprivateStringpouring;...省略setter和getter}复制代码2,abstractbuilder"contractor"HouseBuilder.javapublicinterfaceHouseBuilder{//打基础voiddoFoundation();//覆盖框架voiddoFrame();//浇注voiddpPouring();//房子建好HousegetHouse();}复制代码3,具体建造者“工人”——建洋房PingFangBuilder.java/***TigerChain创建*建洋房*/publicclassPingFangBuilderimplementsHouseBuilder{privateHouse房子=新房子();@OverridepublicvoiddoFoundation(){house.setFoundation("建造平房的地基");}@OverridepublicvoiddoFrame(){house.setFrame("建造平房框架");}@OverridepublicvoiddpPouring(){house.setPouring("盖平房不用浇水,手动刷就行");}@OverridepublicHousegetHouse(){returnhouse;}}复制代码4.具体建造者“工人”——建楼LouFangBuilder.java/***TigerChain创建*建楼*/publicclassLouFangBuilderimplementsHouseBuilder{privateHousehouse=newHouse();@OverridepublicvoiddoFoundation(){house.setFoundation("这栋楼的地基要深十米");}@OverridepublicvoiddoFrame(){house.setFrame("建筑物的框架应该使用非常坚固的钢筋混凝土");}@OverridepublicvoiddpPouring(){house.setPouring("为建筑物开一辆油罐车,用混凝土填充框架");}@OverridepublicHousegetHouse(){returnhouse;}}复制代码5,指挥官“设计部”HouseDirector.java/***TigerChain*Designer*/publicclassHouseDirector{//命令承包商publicvoidbuildHouse(HouseBuilderhouseBuilder){houseBuilder.doFoundation();houseBuilder.doFrame();houseBuilder.dpPourinG();}}复制代码6.测试一下Test.java/***TigerChain创建*Test*/publicclassTest{publicstaticvoidmain(Stringargs[]){//方法一,客户自己盖房子,自己动手System.out.println("========客户自己盖房子,一定要知道盖房子的细节========");房子house=newHouse();house.setFoundation("用户盖房子:打地基");house.setFrame("用户搭建房屋:搭建框架");house.setPouring("用户盖房子:浇筑");System.out.println(house.getFoundation());System.out.println(house.getFrame());System.out.println(house.getPouring());//方法二,客户找建筑商“作为承包商”盖房子,但是要知道如何盖房子“调用建筑商盖房子的命令”System.out.println("========客户直接找盖房子的工人“builder”,客户需要调用builder方法来盖房子,客户必须知道如何盖房子========");HouseBuilderhouseBuilder=newPingFangBuilder();houseBuilder.doFoundation();houseBuilder.doFrame();houseBuilder.dpPouring();房屋house1=houseBuilder.得到房子();System.out.println(house1.getFoundation());System.out.println(house1.得到框架());System.out.println(house1.getPouring());//方法三,使用builder模式,找设计师“设计师拉一帮builder上班”,告诉他我想要什么样的房子,最后客户只需要向设计师要房子。客户不管,最后跟设计师要房子就好========");HouseBuilderpingFangBuilder=newPingFangBuilder();HouseDirectorhouseDirector=newHouseDirector();houseDirector.buildHouse(pingFangBuilder);房子houseCreateByBuilder=pingFangBuilder.getHouse();System.out.println(houseCreateByBuilder.getFoundation());System.out.println(houseCreateByBuilder.getFrame());System.out.println(houseCreateByBuilder.getPouring());比较三种方式,自己盖房,找工人盖房,找设计师盖房,慢慢体会builder模式的优势,不用我为设计师操心。我只需要请设计师盖一个成品房,这样我就不需要知道怎么给客户盖房子了,我可以屏蔽细节。公众号【程序员黄小邪】作者是一个前蚂蚁金服Java工程师,专注分享Java技术干货和求职成长经验,不限BAT面试、算法、计算机基础、数据库、分布式、spring全家桶、微服务、高并发、JVM、Docker容器、ELK、大数据等。关注后回复【书籍】领取Java面试必备电子书20本精选。