将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
[拓展] 与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者,最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。
【转载使用,请注明出处:http://blog.csdn.net/mahoking】
1、 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时;
2、 当构建过程必须允许被构建的对象有不同的表示时。
1、 Builder
为创建一个Product对象的各个部件指定抽象接口。
2、 ConcreteBuilder 【concrete具体的,有形的,实在的,实际的;】
实现Builder的接口以构建和装配该产品的各个部件;
定义并指明它所创建的表示;
提供一个检索(获取)产品的接口。
3、 Director
构建一个使用Builder接口的对象
4、 Product
表示被构建的复杂对象。ConcretBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
有一个人名叫Hoking,需要在自己的宅基地建自己的房子(Product),Hoking不会建造房子、也不会设计自己的房子。所以他需要建房工人(Builder),因为工人会砌墙,但不会设计房子,同时他也需要找个设计师(Director),因为他们会设计房子。当然,在他们之间必须约定工人完全听设计师的领导。就这样,在设计的命令下,工人开始房子的建设。在这个过程中,设计师只是参与设计与下命令,所以最终Hoking需要向工人要房子。
/** * 抽象接口对象Builder * @author Mahc * */ public interface Builder { public void makeWindows(); public void makeFloors(); public Room finishRoom(); } /** * 设计师 * @author Mahc * */ public class Director { public void order(Builder builder){ System.out.println("在设计师的命令下,工人开始房屋的建设!"); builder.makeFloors(); builder.makeWindows(); System.out.println("在设计师的监督下,工人完成房屋的建设!"); } } /** * 建筑工人 * @author Mahc * */ public class Hardhat implements Builder{ private String windows = ""; private String floors = ""; @Override public void makeWindows() { System.out.println("建筑工人开始窗户的搭建!"); windows = "Finished"; } @Override public void makeFloors() { System.out.println("建筑工人开始地板的铺设!"); floors = "Finished"; } @Override public Room finishRoom() { return new Room("Hoking"); } } /** * 具象的表示Room * @author Mahc * */ public class Room { private String householder; //户主 public Room(String householder) { super(); this.householder = householder; } public void sayWelcome() { System.out.println("Welcomen "+householder+" to Yours' New Room!"); } }
以下是测试代码部分。
/** * * 建造者模式(Builder Pattern)测试用例 * @author Mahc * */ public class TestBuilderPattern { public static void main(String[] args) { //创建设计师 Director director = new Director(); //创建建筑工人 Hardhat hardhat = new Hardhat(); //设计师向建筑工人下载建设命令 director.order(hardhat); //建筑工人向Hoking交付房子 Room room = hardhat.finishRoom(); room.sayWelcome(); } }
【转载使用,请注明出处:http://blog.csdn.net/mahoking】
原文地址:http://blog.csdn.net/mahoking/article/details/40086407