建造模式是对象的创建模式,建造模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
在这个模式中,有四个角色;
抽象建造者:给出一个抽象接扩口,以规范产品对象的各个组成成分的建造,一般而言,此接口独立于应用程序的商业逻辑,模式中直接创建产品对象的是具体建造者角色,具体建造者类必须实现这个接口所要求的两种方法,一种是建造方法,另一种是返还结构方法,一般而言,产品所包含的零件数目与建造方法的数目相符,换言之,有多少零件,就有多少相应的建造方法;
具体建造者角色:担任这个角色的是与应用程序紧密相关的一些类,他们在应用程序调用下创建产品的实例,这个角色要完成的任务包括:1,实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。2,在建造过程完成后,提供产品的实例;
导演者角色:担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色;
产品角色:产品是建造中的复杂对象,一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的 接口,而完全可以是不相关联的;
我们可以举一个盖房子工程的例子来说明:我们知道,盖一个房子要的角色有盖房子的各种各样的材料,一个盖房子的工人,还要有一个负责设计的工程师,我们先来说一下各自的特点,作为一个工人,他知道如何去盖厕所,盖大厅,知道怎么具体地使用这些材料,但是,他不具备设计的能力,因为他不会画那些设计图纸,而作为工程师来说,他负责指挥工人去按他所设计的图纸去盖房子,但是他并不知道怎么具体地使用这些材料,因为他不必下工地,没有那些工人的经验老道,这样的话,下次你依然可以用这些相同的材料去盖出不同风格的房子出来,这里还可以有一个房子的主人的角色,他的任务是雇包工头,并给包工头指派了工人,还有材料,然后让包工头自己去负责设计,自己只要最后得到这个房子就可以了。这就是建造者模式。下面是代码;
首先是产品类;
package Build; public class Product { public Product() { // TODO Auto-generated constructor stub } private String part1; private String part2; public String getPart1() { return part1; } public void setPart1(String part1) { this.part1 = part1; } public String getPart2() { return part2; } public void setPart2(String part2) { this.part2 = part2; } }
建造者抽象类;
package Build; public interface Builder { public void buildPart1(); public void buildPart2(); public Product retrieveResult(); }
具体建造者类;
package Build; public class ConcreteBuilder implements Builder{ public ConcreteBuilder() { // TODO Auto-generated constructor stub } private Product product = new Product(); @Override public void buildPart1(){ product.setPart1("编号:9527"); } @Override public void buildPart2(){ product.setPart2("名称:XXX"); } @Override public Product retrieveResult(){ return product; } }
导演者类;
package Build; public class Director { public Director() { // TODO Auto-generated constructor stub } private Builder builder; public Director(Builder builder){ this.builder = builder; } public void construct(){ builder.buildPart1(); builder.buildPart2(); } }
客户端类;
package Build; public class Client { public Client() { // TODO Auto-generated constructor stub } public static void main(String[] args){ Builder builder = new ConcreteBuilder(); Director director = new Director(builder); director.construct(); Product product = builder.retrieveResult(); System.out.println(product.getPart1()); System.out.println(product.getPart2()); } }