定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,也叫生成器模式。
建造者模式通用组成:
首先定义一个抽象的产品类,可以定义一些抽象方法
public abstract class BaseModel {
protected abstract void method1();
protected abstract void method2();
protected abstract void method3();
}
两个具体的产品实现类
public class ProductA extends BaseModel {
@Override
protected void method1() {
System.out.println("ProductA method 1");
}
@Override
protected void method2() {
System.out.println("ProductA method 2");
}
@Override
protected void method3() {
System.out.println("ProductA method 3");
}
}
public class ProductB extends BaseModel {
@Override
protected void method1() {
System.out.println("ProductB method 1");
}
@Override
protected void method2() {
System.out.println("ProductB method 2");
}
@Override
protected void method3() {
System.out.println("ProductB method 3");
}
}
抽象的建造者类,用于规范产品的组建,由其子类进行实现
public abstract class ModelBuilder {
public abstract BaseModel getModel();
}
具体的建造者类,实现抽象类定义的方法,返回具体的建造对象
public class ProductABuilder extends ModelBuilder {
ProductA productA = new ProductA();
@Override
public BaseModel getModel() {
productA.method1();
productA.method2();
productA.method3();
return this.productA;
}
}
public class ProductBBuilder extends ModelBuilder {
ProductB productB = new ProductB();
@Override
public BaseModel getModel() {
productB.method3();
productB.method2();
productB.method1();
return this.productB;
}
}
Director导演类,中间类,负责通知具体建造类建造对象,客户端直接通过导演类封装的方法直接建造对象
public class Director {
private ProductABuilder productABuilder = new ProductABuilder();
private ProductBBuilder productBBuilder = new ProductBBuilder();
public ProductA getProductA(){
return (ProductA) this.productABuilder.getModel();
}
public ProductB getProductB(){
return (ProductB) this.productBBuilder.getModel();
}
}
客户端调用类
public class Client {
public static void main(String[] args) {
Director director = new Director();
ProductA productA = director.getProductA();
System.out.println(productA);
ProductB productB = director.getProductB();
System.out.println(productB);
}
}
应用
优点
- 封装性。可以使客户端不必知道产品内部的组成细节
- 建造者独立,容易扩展。各个具体建造者之间相互独立
- 便于控制细节。由于具体的建造者是独立的,可以对其进行细化,而对其它模块不产生影响
使用场景
- 相同的方法,不同的执行顺序,产生不同的执行结果时,可以使用该模式。
- 多个零部件都可以组装到一个对象中,但是产生的运行结果不相同时,可以使用该模式。
- 产品类比较复杂,或者产品类的调用顺序不同产生不同的影响,可以使用该模式。
- 在对象创建过程中使用到其它对象,这些对象在产品对象的创建过程中不易得到,也可以使用该模式进行封装该对象的创建过程,该场景只能作为一种补偿方法使用。
补充
建造者模式关注的是产品的类型以及具体细节(如方法的调用顺序),这是与工厂模式最大的不同点;工厂模式重点是创建对象。