【设计模式】建造者模式(生成器模式)
使用頻率:★★☆☆☆
一、什么是生成器模式
對復雜對象的創(chuàng)建過程進行抽象,相同的創(chuàng)建步驟,不一樣的創(chuàng)建過程實現(xiàn),生成不同表示的對象;
例如創(chuàng)建一臺電腦,對其應用生成器模式進行創(chuàng)建:
創(chuàng)建過程是指創(chuàng)建cpu、創(chuàng)建內(nèi)存、創(chuàng)建顯示器三個步驟,所有品牌電腦的創(chuàng)建過程都是一樣的,可以對其抽象出一個抽象建造者角色Builder;
不同廠商(指的是具體的Builder實現(xiàn),不同廠商不一樣)生產(chǎn)的電腦,表現(xiàn)出來是不一樣的;
二、適用場合
被創(chuàng)建的對象內(nèi)部結構比較復雜,且需要一步步構造
三、角色
抽象建造者
具體建造者
指揮者
產(chǎn)品
產(chǎn)品消費者
說明:
具體建造者繼承抽象建造者;
指揮者用于生成具體產(chǎn)品對象,且指揮者有一個建造者屬性可以設置更改;
一個指揮者,只要其建造者不一樣,生成的產(chǎn)品對象的表現(xiàn)也不一樣;
產(chǎn)品消費者使用指揮者生成的具體產(chǎn)品對象;
四、例子
demo說明:
以生產(chǎn)PC為例,這里我們假設生產(chǎn)一臺PC只需三個步驟,創(chuàng)建cpu、創(chuàng)建內(nèi)存、創(chuàng)建顯示器,將三個步驟抽象成一個Builder,且該Builder有一個創(chuàng)建待加工的產(chǎn)品的方法和返回成品的方法;
以聯(lián)想電腦和惠普電腦為例,認為它們在生產(chǎn)電腦的過程中,以上三個步驟的實現(xiàn)是不一致的,對應著具體的HPBuilder和LenovoBuilder;
同時,我們把電腦產(chǎn)品封裝成Computer類,其擁有cpu、內(nèi)存、顯示器三個屬性;
然后,再創(chuàng)建一個指揮者類Director,其擁有一個建造者對象和建造PC產(chǎn)品的方法construct,該方法通過具體建造者對象,依次執(zhí)行每個步驟,最后返回建造完成的產(chǎn)品對象;
類圖:
代碼實現(xiàn):
產(chǎn)品角色
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函數(shù)
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());
}
}
運行結果如下,相同的指揮者使用不同的建造者創(chuàng)建了不同的產(chǎn)品:
links
生成器or建造者模式★★☆☆☆
抽象工廠模式★★★★★
工廠方法模式★★★★★
簡單工廠模式★★★★☆
總結
以上是生活随笔為你收集整理的【设计模式】建造者模式(生成器模式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAAS,PAAS,IAAS,BASS,
- 下一篇: 黄花菜有什么功效和作用