建造者模式可以將1個產(chǎn)品的內(nèi)部表象與產(chǎn)品的生成進(jìn)程分割開來,從而可使1個建造進(jìn)程生成具有不同的內(nèi)部表象的產(chǎn)品對象。如果我們用了建造者模式,那末用戶就只需指定需要建造的類型就能夠得到它們,而具體建造的進(jìn)程和細(xì)節(jié)就不需要知道。
建造者模式基礎(chǔ)類圖結(jié)構(gòu)
建造者模式中存在的角色
導(dǎo)演者角色是與客戶端打交道的角色。導(dǎo)演者角色將客戶端創(chuàng)建產(chǎn)品的要求劃分為對各個零件的建造要求,再將這些要求委派給具體建造者角色。具體建造者角色是做具體建造工作的,但是卻不為客戶端所知。
產(chǎn)品角色
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部份被創(chuàng)建"); product.setPart1("part1"); } @Override public void buildPart2() { System.out.println("part2部份被創(chuàng)建"); product.setPart2("part2"); } @Override public Product retrieveResult() { return product; } }
導(dǎo)演者角色
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; } }
客戶端調(diào)用
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分別用來建造產(chǎn)品A和產(chǎn)品B,本來這個具體建造者角色可以設(shè)計成1個,但是如果系統(tǒng)中產(chǎn)品類增加的話,我們就要在這個具體建造者類中添加增加的產(chǎn)品的建造方法,不符合軟件設(shè)計的“開——閉”原則,所以,我采取了1個具體建造者負(fù)責(zé)1個具體產(chǎn)品類。
建造者模式跟抽象工廠模式類似,都是用來創(chuàng)建同時屬于幾個產(chǎn)品族的對象的模式。但是抽象工廠模式中,每次工廠對象被調(diào)用時都會返回1個完全的產(chǎn)品對象,客戶端可能會用這個對象跟其他的對象組成更大更復(fù)雜的對象。而建造者模式是1點1點建造出1個復(fù)雜的產(chǎn)品,建造的進(jìn)程產(chǎn)生的建造者角色內(nèi)部,客戶端拿到的就是1個完全的對象。
上一篇 uva 1393 Highway