定义:将一个复杂对象的构造与表示分离,同样的构建过程可以创建出不同的表示。
将一个复杂对象拆分成多个简单对象,然后通过组合拼成一个完整对象表示,简单对象可以灵活选择,最终导致相同的构建过程,创建出的表示会根据意愿表示出各种不同结果
优点:
- 封装性好,构建和表示分离
- 解耦
- 建造者对创建过程细化,客户端不必知道产品内部组成细节
缺点:
- 产品的组成部分必须相同
- 如果产品内部发生变化,建造者也要同步修改,维护成本大
建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂模式更注重零部件的创建过程,但两者可以结合使用。
模式的实现
复杂产品对象:由多个简单部件组成
package com.yang.builder;
import lombok.Data;
/**
* Iphone 包含多个组成部件的复杂对象
*/
@Data
public class Iphone {
//电池
private Battery battery;
//显示屏
private Screen screen;
//显示产品特性
public void show() {
battery.print();
screen.print();
System.out.println("iphone组装完成");
}
}
组成部件A:
package com.yang.builder;
//具体产品:电池
public class Battery {
public void print() {
System.out.println("电池生产完成");
}
}
组成部件B:
package com.yang.builder;
//具体产品:屏幕
public class Screen {
public void print() {
System.out.println("显示屏生产完成");
}
}
抽象建造者:包含多个部件的抽象创建方法,通常还有一个返回复杂对象的具体方法
package com.yang.builder;
abstract class Builder {
//创建产品对象
protected Iphone iphone = new Iphone();
public abstract void buildBattery();
public abstract void buildScreen();
//返回产品
public Iphone getResult(){
return iphone;
}
}
具体建造者:完成复杂部件的各个组成部件的具体创建方法
package com.yang.builder;
//具体建造者:实现了抽象建造者接口。
public class BuilderImpl extends Builder {
@Override
public void buildBattery() {
iphone.setBattery(new Battery());
}
@Override
public void buildScreen() {
iphone.setScreen(new Screen());
}
}
指挥者:
package com.yang.builder;
public class Director {
private final Builder builder;
public Director(Builder builder){
this.builder = builder;
}
//产品组装方法
public Iphone construct(){
builder.buildBattery();
builder.buildScreen();
return builder.getResult();
}
}
客户端:
package com.yang.builder;
public class Client {
public static void main(String[] args) {
Builder builder = new BuilderImpl();
Director director = new Director(builder);
Iphone iphone = director.construct();
iphone.show();
}
}
电池生产完成
显示屏生产完成
iphone组装完成
建造者模式和工厂模式的区别
- 建造者模式更加注重的是对象创建的顺序,一个复杂对象通过不同的组装顺序,最终的表现也不一样,工厂模式注重的是对象的创建,创建出来的对象都一样。