使用頻率:★★☆☆☆
一、什麼是生成器模式
對複雜對象的建立過程進行抽象,相同的建立步驟,不一樣的建立過程實作,生成不同表示的對象;
例如建立一台電腦,對其應用生成器模式進行建立:
建立過程是指建立cpu、建立記憶體、建立顯示器三個步驟,所有品牌電腦的建立過程都是一樣的,可以對其抽象出一個抽象建造者角色Builder;
不同廠商(指的是具體的Builder實作,不同廠商不一樣)生産的電腦,表現出來是不一樣的;
二、适用場合
被建立的對象内部結構比較複雜,且需要一步步構造
三、角色
- 抽象建造者
- 具體建造者
- 指揮者
- 産品
- 産品消費者
說明:
具體建造者繼承抽象建造者;
指揮者用于生成具體産品對象,且指揮者有一個建造者屬性可以設定更改;
一個指揮者,隻要其建造者不一樣,生成的産品對象的表現也不一樣;
産品消費者使用指揮者生成的具體産品對象;
四、例子
demo說明:
以生産PC為例,這裡我們假設生産一台PC隻需三個步驟,建立cpu、建立記憶體、建立顯示器,将三個步驟抽象成一個Builder,且該Builder有一個建立待加工的産品的方法和傳回成品的方法;
以聯想電腦和惠普電腦為例,認為它們在生産電腦的過程中,以上三個步驟的實作是不一緻的,對應着具體的HPBuilder和LenovoBuilder;
同時,我們把電腦産品封裝成Computer類,其擁有cpu、記憶體、顯示器三個屬性;
然後,再建立一個指揮者類Director,其擁有一個建造者對象和建造PC産品的方法construct,該方法通過具體建造者對象,依次執行每個步驟,最後傳回建造完成的産品對象;
類圖:
代碼實作:
産品角色
package com.pichen.dp.creationalpattern.builder;
public class Computer {
private String cpu;
private String ram;
private String monitor;
/**
* @return the cpu
*/
public String getCpu() {
return cpu;
}
/**
* @param cpu the cpu to set
*/
public void setCpu(String cpu) {
this.cpu = cpu;
}
/**
* @return the ram
*/
public String getRam() {
return ram;
}
/**
* @param ram the ram to set
*/
public void setRam(String ram) {
this.ram = ram;
}
/**
* @return the monitor
*/
public String getMonitor() {
return monitor;
}
/**
* @param monitor the monitor to set
*/
public void setMonitor(String monitor) {
this.monitor = monitor;
}
public String toString(){
return "PC:" + this.cpu + ", " + this.ram + ", " + this.monitor;
}
}
View Code
抽象建造者
package com.pichen.dp.creationalpattern.builder;
public abstract class Builder {
private Computer pc ;
public abstract void buildCpu();
public abstract void buildRam();
public abstract void buildMonitor();
public void createComputer(){
this.pc = new Computer();
}
public Computer getComputer(){
return this.pc;
}
}
View Code
兩個具體建造者
package com.pichen.dp.creationalpattern.builder;
public class LenovoBuilder extends Builder{
@Override
public void buildCpu() {
System.out.println("lenovo: build cpu start...");
this.getComputer().setCpu("lenovo cpu");
System.out.println("lenovo: build cpu end...");
}
@Override
public void buildRam() {
System.out.println("lenovo: build ram start...");
this.getComputer().setRam("lenovo ram");
System.out.println("lenovo: build ram end...");
}
@Override
public void buildMonitor() {
System.out.println("lenovo: build monitor start...");
this.getComputer().setMonitor("lenovo monitor");
System.out.println("lenovo: build monitor end...");
}
}
View Code
package com.pichen.dp.creationalpattern.builder;
public class HPBuilder extends Builder{
@Override
public void buildCpu() {
System.out.println("hp: build cpu start...");
this.getComputer().setCpu("hp cpu");
System.out.println("hp: build cpu end...");
}
@Override
public void buildRam() {
System.out.println("hp: build ram start...");
this.getComputer().setRam("hp ram");
System.out.println("hp: build ram end...");
}
@Override
public void buildMonitor() {
System.out.println("hp: build monitor start...");
this.getComputer().setMonitor("hp monitor");
System.out.println("hp: build monitor end...");
}
}
View Code
指揮者
package com.pichen.dp.creationalpattern.builder;
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Computer construct(){
this.builder.createComputer();
this.builder.buildCpu();
this.builder.buildRam();
this.builder.buildMonitor();
return this.builder.getComputer();
}
/**
* @return the builder
*/
public Builder getBuilder() {
return builder;
}
/**
* @param builder the builder to set
*/
public void setBuilder(Builder builder) {
this.builder = builder;
}
}
main函數
package com.pichen.dp.creationalpattern.builder;
public class Main {
public static void main(String[] args) {
Builder hpBuilder = new HPBuilder();
Director director = new Director(hpBuilder);
Computer hpPC = director.construct();
System.out.println(hpPC.toString());
Builder lenovoBuilder = new LenovoBuilder();
director.setBuilder(lenovoBuilder);
Computer lenovoPC = director.construct();
System.out.println(lenovoPC.toString());
}
}
運作結果如下,相同的指揮者使用不同的建造者建立了不同的産品:
links
生成器or建造者模式★★☆☆☆
抽象工廠模式★★★★★
工廠方法模式★★★★★
簡單工廠模式★★★★☆