文章内容
一、什么是建造者模式
建造者模式,将一个复杂对象的构建和它的表示分离,使同样的构建构成可以创建不同的表示。
从定义可以看出,建造者模式适用于一个复杂的对象的建造,而且在建造的过程中,客户端不必知道产品内部组成的细节,实现了构建和装配的解耦。
二、建造者模式角色
- 抽象建造者类(Builder):实现复杂对象的那部分的创建,并不涉及具体的部件对象的创建。
- 具体建造者类(ConcreteBuilder):实现Builder接口,完成复杂产品的各个部件的具体创建方法。
- 产品类(Product):要创建的复杂对象。
- 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
三、建造者模式UML类图
四、建造者模式优缺点
1、优点
- 封装性好。在使用建造者模式中的场景中,产品类和建造者类是比较稳定的,将主要的业务逻辑封装在指挥者类中。
- 产品创建与产品组装解耦。客户端无需知道产品内部组成的细节。
- 更加精细的控制产品的创建过程。将复杂产品的创建步骤分解到不同的方法中,使得创建过程更加清晰可控。
- 扩展性强。如果新增一个建造者类,不需要修改之前的代码,符合开闭原则。
2、缺点
- 不适合产品之间差异性较大的场景,使用范围受到一定限制。
五、建造者模式demo示例
1、Demo需求
模拟泡红茶:泡红茶分3步,1-向茶壶加水,2-把水烧开,3-加入茶叶,使用建造者模式来实现。
2、代码实现
/**
* 产品类:茶
*/ public class Tea {
private String name;
public Tea(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 抽象建造者类
*/ public abstract class ITeaBuilder {
public abstract void addWater();
public abstract void boilWater();
public abstract void addTea();
public abstract Tea buildTea();
}
/**
* 红茶建造者类
*/ public class RedTeaBuilder extends ITeaBuilder {
private Tea tea = new Tea(" 红茶 ");
public void boilWater() {
System.out.println("烧开水...");
}
public void addTea() {
System.out.println("加入茶叶...");
}
public void addWater() {
System.out.println("加入热水...");
}
public Tea buildTea() {
System.out.println("红茶泡好了....");
return tea;
}
}
/**
* 指挥者类:负责泡茶过程顺序
*/ public class RedTeaDirector {
public Tea createTea(ITeaBuilder teaBuilder) {
teaBuilder.boilWater();
teaBuilder.addTea();
teaBuilder.addWater();
return teaBuilder.buildTea();
}
}
3、测试
public class Client {
public static void main(String[] args) {
RedTeaDirector teaDirector = new RedTeaDirector();
Tea redTea = teaDirector.createTea(new RedTeaBuilder());
System.out.println("==========================");
}
}