文章目录
介绍
描述
建造者模式设计模式属于创建型模式,通过多个简单的对象去简化一个复杂对象的构建。通过构建和装配的解耦,不同的构建器,也可以做出不同的对象,相同的构建器由于装配顺序的不同也可以做出不同的对象,也就是实现了构建算法、装配算法的分离,实现更好的复用。同时用户只需要指定复杂对象,而不用明确具体操作。
特点
优点:封装性好,创建和使用分离,无需修改源代码,一定程度上的解耦,方便代码的维护。
缺点:该类产品必须有相同点,使用范围有限,建造者模式创建出的对象其组成部分基本一致,若所构建对象之间差异较大,则不适合该模式。如果产品内部发生改变,整体都要进行改动,将设计到许多建造类修改。
实现原理
- 产品:提供构建对象。
- 建造者:抽象共同行为。
- 建造者实现:针对具体方案进行实现。
- 导演:管理者掌管建造出的实例的实际生产过程,返回最终的产品。
适用
-
用于描述具体复杂对象的创建。
-
需要生产的对象内部属性本身互相依赖。
建造者模式(实现)
第一步:定义Product(产品角色), 一个具体的产品对象。
/**
* 产品对象
*/
public class Carrier {
private String name;
private String tyreCount;
private String prince;
// getter setter toString 省略...
}
第二步:定义Builder(抽象建造者),创建一个Product对象的各个部件指定的抽象接口。
public abstract class CarrierBuilder {
Carrier carrier = new Carrier();
// 构建操作
public abstract String name();
public abstract String tyreCount();
public abstract String prince();
// 产品 返回
public Carrier buildCarrier() {
return carrier;
}
}
第三步:定义ConcreteBuilder(具体建造者),实现抽象接口,构建和装配各个部件。
public class CarBuilder extends CarrierBuilder{
@Override
public String name() {
carrier.setName("汽车");
return carrier.getName();
}
@Override
public String tyreCount() {
carrier.setTyreCount("轮胎-4");
return carrier.getTyreCount();
}
@Override
public String prince() {
carrier.setPrince("价格-3600");
return carrier.getPrince();
}
}
public class CycleBuilder extends CarrierBuilder{
@Override
public String name() {
carrier.setName("自行车");
return carrier.getName();
}
@Override
public String tyreCount() {
carrier.setTyreCount("轮胎-2");
return carrier.getTyreCount();
}
@Override
public String prince() {
carrier.setPrince("价格-1800");
return carrier.getPrince();
}
}
第四步:定义Director(指挥者), 构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。隔离了客户与对象的生产过程,负责控制产品对象的生产过程。
/**
* 指挥者 构建一个使用builder接口的对象
*/
public class CarrierDirector {
private CarrierBuilder carrierBuilder;
// 通过setter 传入carrierBuilder
public CarrierDirector(CarrierBuilder carrierBuilder) {
this.carrierBuilder = carrierBuilder;
}
// 具体的实现流程 交给指挥者
public Carrier constructCarrier() {
// 指定产品名称
carrierBuilder.name();
// 指定轮胎
carrierBuilder.tyreCount();
// 指定价格
carrierBuilder.prince();
// 准备完毕 返回给客户完整
return carrierBuilder.buildCarrier();
}
}
第五步:定义测试类。
public class Test {
public static void main(String[] args) {
CarBuilder carBuilder = new CarBuilder();
CarrierDirector directorCar = new CarrierDirector(carBuilder);
Carrier car = directorCar.constructCarrier();
System.out.println(car);
CycleBuilder cycleBuilder = new CycleBuilder();
CarrierDirector directorCycle = new CarrierDirector(cycleBuilder);
Carrier cycle = directorCycle.constructCarrier();
System.out.println(cycle);
}
}
测试结果: