builder模式通过设置一些属性来创建对象,根据设置属性的顺序分为两种:
1. 无顺序要求
2. 有顺序要求
常见是无顺序要求的,比如dialog的创建。
1,无顺序要求
需求:
- 创建一个Macbook,电脑有三个属性 操作系统、键盘、鼠标。
思路:
- 使用Macbook 内部类Builder来为Macbook设置属性,并创建最终的Macbook
- 因为Macbook属于电脑,可以再建一个computer的接口
代码:
通过builder的的static内部类实现
package com.example.builder;
/**
* 创建者模式
* @author car
*
*/
public class BuilderPattern {
public static void main(String[] args) {
BuilderPattern pattern=new BuilderPattern();
pattern.build();
}
public void build() {
Macbook.MacbookBuilder builder=new Macbook.MacbookBuilder();
Computer macbook=builder.setBoard("英特尔 I7").setDisplay("Retina 显示器").setOS("MacOS").build();
System.out.println(macbook.toString());
}
}
Computer.java:
package com.example.builder;
/**
* 被创建者 的抽象
* @author car
*
*/
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOS;
@Override
public String toString() {
return mBoard+" "+mDisplay+" "+mOS;
}
}
Macbook.java
package com.example.builder;
public class Macbook extends Computer{
MacbookBuilder builder;
public Macbook(MacbookBuilder builder) {
this.mDisplay=builder.mDisplay;
this.mBoard=builder.mBoard;
this.mOS=builder.mOS;
}
public static class MacbookBuilder extends Builder{
protected String mBoard;
protected String mDisplay;
protected String mOS;
//设置主板
public MacbookBuilder setBoard(String mBoard) {
this.mBoard=mBoard;
return this;
}
//设置显示器
public MacbookBuilder setDisplay(String mDisplay) {
this.mDisplay=mDisplay;
return this;
}
@Override
public MacbookBuilder setOS(String mOS) {
this.mOS=mOS;
return this;
}
@Override
public Computer build(){
return new Macbook(this);
}
}
}
Builder.java
package com.example.builder;
/**
* 抽象的 创建者
* @author car
*
*/
public abstract class Builder {
protected String mBoard;
protected String mDisplay;
protected String mOS;
//设置主板
public abstract Builder setBoard(String mBoard);
//设置显示器
public abstract Builder setDisplay(String mDisplay);
//设置操作系统
public abstract Builder setOS(String mOS);
//生成一个电脑
public abstract Computer build();
}
2,有顺序要求
上面无顺序的只要把需要的属性设置成功就ok。
有顺序要求的举个例子。安装电脑我们不仅需要键盘、显示器等原材料,我们还要知道安装的顺序,即需要一个工程师在一边指导工人干活。
需求:安装电脑,先安装系统、再安装显示器、最后键盘
思路:builder负责安装、director负责设计指挥、产品Macbook
代码:
director控制builder的执行顺序,赋值过程在macbook里面实现:
package com.example.builder.store;
public class BuilderPattern {
public static void main(String[] args) {
BuilderPattern pattern=new BuilderPattern();
pattern.build();
}
public void build() {
ComputerBuilder builder = new ComputerBuilder();
Director director = new Director();
director.command(builder);
System.out.println(builder.getComputer().toString());
}
}
Builder.java
package com.example.builder.store;
import com.example.builder.Computer;
interface Builder {
//设置主板
public abstract void createBoard();
//设置显示器
public abstract void createDisplay();
//设置操作系统
public abstract void createOS();
}
ComputerBuilder.java
package com.example.builder.store;
public class ComputerBuilder implements Builder{
Macbook macbook = new Macbook();
@Override
public void createBoard() {
// TODO Auto-generated method stub
macbook.mBoard="board";
}
@Override
public void createDisplay() {
// TODO Auto-generated method stub
macbook.mDisplay="diaplsy";
}
@Override
public void createOS() {
// TODO Auto-generated method stub
macbook.mOS="os";
}
public Macbook getComputer(){
return macbook;
}
}
Director.java
package com.example.builder.store;
public class Director {
public void command(Builder builder){
builder.createOS();
builder.createDisplay();
builder.createBoard();
}
}
Macbook.java
package com.example.builder.store;
public class Macbook {
protected String mBoard;
protected String mDisplay;
protected String mOS;
@Override
public String toString(){
return mBoard+mDisplay+mOS;
}
}