文章已收录到我的仓库:Java学习笔记和免费书籍分享设计意图为了将复杂对象的构造与其表示分离,所以那个对象可以通过不同的表示它被创建。例如,迷宫可能有墙壁、房间和门,但没有数量。一个迷宫可能只有一堵墙,也可能只有两堵墙,也可能只有两个房间加一扇门……如果重载生成迷宫,代码量是无法估量的,巨大的。对于具有大量组件的对象(迷宫可以有许多墙或房间或门),该对象的构造使用其组件未定义(使用的墙,房间,门的数量未定义),如果你想精细控制建造过程,可以使用建造者模式来解决。建造者模式的目的是构造对象,因此它是一种创建型模式。在适用场景的构建过程中,构建的对象具有不同的表示形式。一些基本成分不会改变,而其组合却经常发生变化。需要生成的对象的内部属性本身是相互依赖的。设计给总指挥分配一个建造者,总指挥设计如何建造,建造者实际建造,最后建造者将产品交给总指挥,用户完成指挥的交付——总司令。这样的过程非常人性化。比如我们实际的房屋装修也是如此。我们邀请一些工人和一名工人领导来设计和建造想法,并指导这些工人如何装修。接下来我们只处理workerleader。工头把装修好的房子交给了我们。代码示例考虑上面的迷宫问题://定义迷宫类classMaze{publicvoidsetRoom(intx,inty,introomId){System.out.println("in["+x+","+y+"]创建编号为"+roomId+""的房间;//保存相关信息}publicvoidsetDoor(intId1,intId2){System.out.println("在组件编号为"+id1+"且组件编号为"+id2+"的组件上建立一扇门");//保存相关信息}publicvoidsetBarrier(intx,inty,intbarrierId){System.out.println("in["+x+","+y+"]创建一个编号为"+barrierId+"");//保存相关信息}}//定义迷宫生成器界面interfaceMazeBuilder{voidbuildRoom(intx,inty,introomId);//建一个房间voidbuildDoor(intId1,intId2);//建一个门voidbuildBarrier(intx,inty,intbarrierId);//搭建障碍物MazegetMaze();//得到最终结果}//迷宫施工队A,每个施工队都有不同的施工方法classMazeBuilderAimplementsMazeBuilder{//施工组会逐步完善迷宫交付给客户privateMazemaze=newMaze();@OverridepublicvoidbuildRoom(intx,inty,introomId){迷宫。setRoom(x,y,roomId);}@OverridepublicvoidbuilldDoor(intId1,intId2){maze.setDoor(Id1,Id2);}@OverridepublicvoidbuildBarrier(intx,inty,intbarrierId){maze.setBarrier(x,y,barrierId);}@OverridepublicMazegetMaze(){返回迷宫;}}//迷宫指挥官类MazeDirecotr{MazeBuildermazeBuilder;publicMazeDirecotr(MazeBuildermazeBuilder){this.mazeBuilder=mazeBuilder;}//把工作交给指挥,用户只需要等待建筑完成就可以拿走例子publicMazegetMaze(){//具体的设计思路在这里生成//这里我们可以一步步构建复杂的模型按照我们的思路走//比如这里我要建两个房间,一个在中门mazeBuilder.buildRoom(0,0,0);mazeBuilder.buildRoom(0,1,1);mazeBuilder.buildDoor(0,1);//实际工作由工人建造//工人的一般命令得到我们手中的最终产品,总指挥完成与用户的交接returnmazeBuilder.getMaze();}}//测试类publicclassTest{publicstaticvoidmain(String[]args){//邀请工人MazeBuildermazeBuilder=newMazeBuilderA();//请命令并将工人移交给MazeDirecotrmazeDirecotr=newMaze导演(mazeBuilder);//最终与统帅Maze完成产品投放maze=mazeDirecotr.getMaze();}}//输出/*在[0,0]处建造一个编号为0的房间在[0,1]处建造一个编号为1的房间并在组件号0和组件号1之间创建一扇门*/通过builder模式下,我们不再需要重载大量函数,通过导演类的设计一步步生成。我们期望可以使用更细粒度的控制来创建对象。在实际开发中,director类是由用户自行编写定义的。一种优化技术是使用链式编程。我们可以这样定义建造者接口://定义迷宫建造者界面interfaceMazeBuilder{MazeBuilderbuildRoom(intx,inty,introomId);//建造房间MazeBuilderbuildDoor(intId1,intId2);//建造adoorMazeBuilderbuildBarrier(intx,inty,intbarrierId);//搭建一个障碍迷宫getMaze();//得到最终结果}然后我们可以在director类中这样写代码:mazeBuilder.buildRoom(0,0,0).buildRoom(0,1,1).buildDoor(0,1);优缺点总结优点:1.构建器独立,接口方式,易于扩展。2、细节风险易于控制。3、解耦设计和使用,有利于扩展和维护。缺点:1.产品必须有共同点,范围有限。2.如果内部变化复杂,构造类就会很多。注意:与工厂模式不同的是建造者模式更注重零件组装的顺序。
