建造者模式
1. 是什么
百科定义:
将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
对象的表示就是对象的细节,如具体的属性。建造者模式主要是抽象出构造一个复杂对象的流程,这里的复杂对象的复杂之处在于它是由若干低层的对象所组成,比如汽车对象,由发动机、变速器、底盘等低层次对象构成。建造者模式在这就是把造车这个事情的流程抽象出来,这样同一个流程可以用来造不同的细节(表示)的具体的汽车,从而达到构建和表示分离,构建过程可以复用的作用。
2. 有什么用
抽象出对象构建的流程,使得具体表示能和构建流程分离。作用自然是为了代码解耦和更好地面向变化。
3. 怎么用
首先要明确,要构建的对象比较复杂,是多个低层次的模块的集成构建,而且这个构建流程是通用的。
示例代码
(以建造汽车为例)
- 产品(车辆)接口
public interface Vehicle {
public void run();
}
- 具体产品
public class Benz implements Vehicle {
@Override
public void run() {
System.out.println("奔驰run");
}
}
- 建造者接口
public abstract class AbstractVehicleBuilder {
// 发动机
public abstract void buildEngine();
// 变速箱
public abstract void buildTransmission();
// 底盘
public abstract void buildChassis();
//
public abstract Vehicle getVehicle() ;
}
- 具体建造者
public class BenzBuilder extends AbstractVehicleBuilder {
Benz benz = new Benz();
@Override
public void buildEngine() {
System.out.println("组装奔驰的engine");
}
@Override
public void buildTransmission() {
System.out.println("组装奔驰的变速箱");
}
@Override
public void buildChassis() {
System.out.println("组装奔驰的底盘");
}
@Override
public Vehicle getVehicle() {
return benz;
}
}
- 和client确认需求,指挥建造的领导
public class Director {
public Vehicle build(AbstractVehicleBuilder builder) {
builder.buildChassis();
builder.buildEngine();
builder.buildTransmission();
return builder.getVehicle();
}
}
- Client
public class Client {
public static void main(String[] args) {
// client要一辆奔驰
Director director = new Director();
// 了解需求了找到建造者
AbstractVehicleBuilder builder = new BenzBuilder();
Benz benz = (Benz) director.build(builder);
// 好了,跑跑看
benz.run();
}
}
-
类图
builder.png
示例中,只有一个具体产品,对于一个具体的建造者,建造业务在指导者的建造方法内,具体的建造作业由建造者来实行。client只要告诉建造方需要的产品类型,剩下的都交给建造者。
如果将来需要建造奥迪汽车,执行增加对应的实体类和建造者类即可。
所以,建造者模式的本质是抽象出构建的通用流程,细节有具体的实现类完成。从而达到构建和表示分离。
