建造者模式(或者称为生成器(构建器)模式)
一、什么是建造者模式?
将复杂对象的构建与表示进行分离,使得统一的构建过程,可以创建出不同的对象表现模式
就是将复杂对象里面的成员变量,设置不同的值,使得生成出来的对象拥有不同的属性值;
二、特点
要解决的问题:复杂对象使用不同的构建过程,产生拥有不同对象属性的对象,调用者只需要设定不同的属性值,不需要了解属性值之间是怎么构建出来对象的;
抽象建造者:抽象创建者接口
实际建造者:抽象创建者的不同实现
产品:复杂产品
指挥者:用来与调用者交互,实现通过抽象创建者生产出产品的流程
三、角色和实现
实现方式一:
- 抽象建造者
public interface CarBuilderInterface {
Object builderWheel();
Object builderFrame();
Object builderCoreComponent();
}
- 具体建造者
public class CarBuilderInterfaceImpl implements CarBuilderInterface {
@Override
public Object builderWheel() {
System.out.println("生产了一个轮子");
return "返回轮子";
}
@Override
public Object builderFrame() {
System.out.println("生产了一个车架");
return "返回车架";
}
@Override
public Object builderCoreComponent() {
System.out.println("生产了核心组件");
return "返回核心组件";
}
}
- 具体的产品
public class CarProduct {
private String wheel;
private String frame;
private String coreComponent;
public String getWheel() {
return wheel;
}
public void setWheel(String wheel) {
this.wheel = wheel;
}
public String getFrame() {
return frame;
}
public void setFrame(String frame) {
this.frame = frame;
}
public String getCoreComponent() {
return coreComponent;
}
public void setCoreComponent(String coreComponent) {
this.coreComponent = coreComponent;
}
}
- 指挥者Director:实例化建造者,通过建造者组织具体的产品
public class CarBuilderDirector {
private CarBuilderInterface carBuilderInterface;
public CarBuilderDirector(CarBuilderInterface carBuilderInterface) {
this.carBuilderInterface = carBuilderInterface;
}
public CarProduct builderCarProduct() {
CarProduct carProduct = new CarProduct();
carProduct.setWheel(carBuilderInterface.builderWheel().toString());
carProduct.setFrame(carBuilderInterface.builderFrame().toString());
carProduct.setCoreComponent(carBuilderInterface.builderCoreComponent().toString());
return carProduct;
}
}
- 当需要使用建造者模式进行对象构建时:
public class Client {
public static void main(String[] args) {
CarBuilderInterface carBuilderInterface = new CarBuilderInterfaceImpl();
CarBuilderDirector carBuilderDirector = new CarBuilderDirector(carBuilderInterface);
CarProduct carProduct = carBuilderDirector.builderCarProduct();
System.out.println("生成了一个车:" + carProduct.getWheel() + "," + carProduct.getFrame() + "," + carProduct.getCoreComponent());
}
}
实现方式二:使用静态内部类的方式实现
/**
* 通过内部类的形式实现建造者模式,并且可以实现链式调用
*/
public class CarBuilderExample {
private String wheel;
private String frame;
private String coreComponent;
private CarBuilderExample(String wheel, String frame, String coreComponent) {
this.wheel = wheel;
this.frame = frame;
this.coreComponent = coreComponent;
}
public static class CarBuilderExampleBuilder {
private String wheel;
private String frame;
private String coreComponent;
public static CarBuilderExampleBuilder builder() {
return new CarBuilderExampleBuilder();
}
public CarBuilderExampleBuilder wheel(String wheel) {
this.wheel = wheel;
return this;
}
public CarBuilderExampleBuilder frame(String frame) {
this.frame = frame;
return this;
}
public CarBuilderExampleBuilder coreComponent(String coreComponent) {
this.coreComponent = coreComponent;
return this;
}
public CarBuilderExample builderExample() {
return new CarBuilderExample(wheel, frame, coreComponent);
}
}
public static void main(String[] args) {
CarBuilderExampleBuilder builder = CarBuilderExampleBuilder.builder();
CarBuilderExample carBuilderExample = builder
.wheel("轮子")
.frame("车架+")
.coreComponent("核心部件+").builderExample();
System.out.println(carBuilderExample.coreComponent + carBuilderExample.frame + carBuilderExample.wheel);
}
}
lombok包里面的@Builder也是通过这种模式实现的
四、与工厂方法和抽象工厂之间的区别
工厂是指创建一个类型的多种实现
抽象工厂是指创建一系列类型的多种实现