基本概念
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。建造者模式一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
类图
建造者模式主要包含4个角色:
抽象建造者(Builder):要构建的目标对象所需要的"零部件",大多是接口。
具体建造者(ConcreteBuilder):Builder的实现类,提供创建方法以及产品实例。
产品类(Product):要构建的对象,内部包含很多其他的"零部件对象"。
指挥者类(Director):负责调用Builder的方法构建对象,返回实例,对调用者屏蔽了具体的构建过程,构建者一般只与指挥者类打交道。
代码实现
java
/**
* 产品类
*/
public class Car {
private String window;
private String tyre;
private String seat;
private boolean ai;
public boolean getAi() {
return ai;
}
public void setAi(boolean ai) {
this.ai = ai;
}
public String getWindow() {
return window;
}
public void setWindow(String window) {
this.window = window;
}
public String getTyre() {
return tyre;
}
public void setTyre(String tyre) {
this.tyre = tyre;
}
public String getSeat() {
return seat;
}
public void setSeat(String seat) {
this.seat = seat;
}
@Override
public String toString() {
String rs = "这款汽车有:" + this.getSeat() + "、" + this.getTyre() + "、" + this.getWindow();
if(this.getAi()){
rs += "、自动驾驶";
}
return rs;
}
}
java
/**
* 抽象建造者
*/
public interface ICarBuilder {
public ICarBuilder setWindows(String window);
public ICarBuilder setSeat(String seat);
public ICarBuilder setTyre(String tyre);
public ICarBuilder setAI(boolean ai);
public Car createCar();
}
java
/**
* 具体建造者
*/
public class CarBuilder implements ICarBuilder{
private Car car = new Car();
@Override
public ICarBuilder setWindows(String window) {
this.car.setWindow(window);
System.out.println("给汽车安装[" + window + "]");
return this;
}
@Override
public ICarBuilder setSeat(String seat) {
this.car.setSeat(seat);
System.out.println("给汽车安装[" + seat + "]");
return this;
}
@Override
public ICarBuilder setTyre(String tyre) {
this.car.setTyre(tyre);
System.out.println("给汽车安装[" + tyre + "]");
return this;
}
@Override
public ICarBuilder setAI(boolean ai) {
this.car.setAi(ai);
if (ai){
System.out.println("给汽车安装[自动驾驶]");
}
return this;
}
@Override
public Car createCar() {
return this.car;
}
}
java
/**
* 指挥者
*/
public class CarDirector {
public Car createCar(ICarBuilder carBuilder){
carBuilder.setSeat("加热座椅")
.setTyre("耐磨轮胎")
.setWindows("普通窗户");
Car car = carBuilder.createCar();
return car;
}
public Car createAICar(ICarBuilder carBuilder){
carBuilder.setSeat("加热座椅")
.setTyre("耐磨轮胎")
.setWindows("普通窗户")
.setAI(true);
Car car = carBuilder.createCar();
return car;
}
}
java
/** 测试 **/
public class Client {
public static void main(String[] args) {
CarDirector director = new CarDirector();
Car car = director.createCar(new CarBuilder());
System.out.println(car.toString());
System.out.println("---------------------------------");
Car aiCar = director.createAICar(new CarBuilder());
System.out.println(aiCar);
}
}
运行结果
给汽车安装[加热座椅] 给汽车安装[耐磨轮胎] 给汽车安装[普通窗户] 这款汽车有:加热座椅、耐磨轮胎、普通窗户 --------------------------------- 给汽车安装[加热座椅] 给汽车安装[耐磨轮胎] 给汽车安装[普通窗户] 给汽车安装[自动驾驶] 这款汽车有:加热座椅、耐磨轮胎、普通窗户、自动驾驶