设计模式—建造者模式
一、案例
1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。
2、JAVA 中的 StringBuilder。
3、多个部件或者零件,都可以装配到一个对象中,但是产生的运行结果又相同。
4、产品类非常复杂,或者产品类中调用顺序不同产生了不同的作用。
5、初始化一个对象特别复杂,如使用多个构造方法,或者说有很多参数,并且都有默认值时。
二、模型
将一个复杂的对象的构建与它的表示分离,是的同样的构建过程可以创建不同的表示。
三、代码实现
- 抽象产品
package com.wk.designPatterns.builderPattern;
//计算机抽象类
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOs;
protected Computer(){}
public void setBorad(String board){
mBoard = board;
}
public void setDisplay(String display){
mDisplay = display;
}
abstract void setOs();
public String toString(){
return "computer{"+mBoard + "," +mDisplay + "," +mOs +"}";
}
}
- 具体产品
package com.wk.designPatterns.builderPattern;
//具体产品类
public class MacBook extends Computer {
protected MacBook() {
}
public void setOs() {
mOs = "Mac OS X 12";
}
}
- 抽象建造者
package com.wk.designPatterns.builderPattern;
public abstract class Builder {
abstract void buildBoard(String board);
abstract void buildDisplay(String display);
abstract void buildOs();
abstract Computer build();
}
- 具体建造者
package com.wk.designPatterns.builderPattern;
public class MacBuilder extends Builder {
Computer computer = new MacBook();
@Override
void buildBoard(String board) {
computer.setBorad(board);
}
void buildDisplay(String display) {
computer.setDisplay(display);
}
void buildOs() {
computer.setOs();
}
Computer build() {
return computer;
}
}
- 监工
package com.wk.designPatterns.builderPattern;
public class Director {
Builder builder = null;
public Director(Builder builder1) {
builder = builder1;
}
public void construct(String board, String display) {
builder.buildBoard(board);
builder.buildDisplay(display);
builder.buildOs();
}
}
- 测试
package com.wk.designPatterns.builderPattern;
public class TestDemo {
public static void main(String[] args) {
Builder builder = new MacBuilder();
Director director = new Director(builder);
director.construct("intel主板", "retina显示器");
Computer computer = builder.build();
System.out.println(computer);
}
}
运行结果: