建造者模式可以將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