建造者模式可以将1个产品的内部表象与产品的生成进程分割开来,从而可使1个建造进程生成具有不同的内部表象的产品对象。如果我们用了建造者模式,那末用户就只需指定需要建造的类型就能够得到它们,而具体建造的进程和细节就不需要知道。
建造者模式基础类图结构
建造者模式中存在的角色
导演者角色是与客户端打交道的角色。导演者角色将客户端创建产品的要求划分为对各个零件的建造要求,再将这些要求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但是却不为客户端所知。
产品角色
package com.designpattern.builder; /** * Created by Administrator on 2016/9/21. */ public class Product { 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; } @Override public String toString() { return "Product{" + "part1='" + part1 + '\'' + ", part2='" + part2 + '\'' + '}'; } }
抽象建造者角色
package com.designpattern.builder; /** * Created by Administrator on 2016/9/21. */ abstract public class Builder { public abstract void buildPart1(); public abstract void buildPart2(); public abstract Product retrieveResult(); }
具体建造者角色
package com.designpattern.builder; /** * Created by Administrator on 2016/9/21. */ public class ConcreteBuilder extends Builder { private Product product = new Product(); @Override public void buildPart1() { System.out.println("part1部份被创建"); product.setPart1("part1"); } @Override public void buildPart2() { System.out.println("part2部份被创建"); product.setPart2("part2"); } @Override public Product retrieveResult() { return product; } }
导演者角色
package com.designpattern.builder; /** * Created by Administrator on 2016/9/21. */ public class Director { private Builder builder; public Product construct(Builder builder){ builder.buildPart1(); builder.buildPart2(); Product product = builder.retrieveResult(); return product; } }
客户端调用
package com.designpattern.builder; /** * Created by Administrator on 2016/9/21. */ public class Client { public static void main(String[] args) { Director director = new Director(); Builder builder = new ConcreteBuilder(); Product product = director.construct(builder); System.out.println(product); } }
具体建造角色分成A和B分别用来建造产品A和产品B,本来这个具体建造者角色可以设计成1个,但是如果系统中产品类增加的话,我们就要在这个具体建造者类中添加增加的产品的建造方法,不符合软件设计的“开——闭”原则,所以,我采取了1个具体建造者负责1个具体产品类。
建造者模式跟抽象工厂模式类似,都是用来创建同时属于几个产品族的对象的模式。但是抽象工厂模式中,每次工厂对象被调用时都会返回1个完全的产品对象,客户端可能会用这个对象跟其他的对象组成更大更复杂的对象。而建造者模式是1点1点建造出1个复杂的产品,建造的进程产生的建造者角色内部,客户端拿到的就是1个完全的对象。
上一篇 uva 1393 Highway