1.简要概述
- 建造者模式也可以叫做生成器模式。
- 建造者模式就是说首先封装一个对象的构造过程,然后按照这个过程步骤去构建这个对象实例。
- 建造者模式的本质就是分离了对象子组件的单独构建和装配过程,从而可以构造出更加复杂的对象。复杂对象就好比一部有待建造的手机,而对象中的属性就好比手机中的各个部件,所以建造对象的过程就好比是手机部件相互组合建造手机的过程。
- 对于复杂对象而言,它们的创建过程很复杂,因此我们想把这些过程单独的抽离开来封装到一个类中,而不是让客户端去直接处理其中的细节。建造者模式可以将这些创建的过程分割开来,按照某种指定步骤去创建复杂的对象,客户端只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。
- 建造者模式将一个复杂对象的构建与它的表示进行了解耦,使得同样的构建过程可以创建不同的表示。也就是说不同的构建器,相同的装配,可以做出不同的对象。相同的构建器,不同的装配顺序,也可以做出不同的对象,实现了更好的复用。
- 建造者模式中,我们引入了一个指挥者类,使用该类的好处:
- 一方面使客户端与具体生产过程进行了解耦,客户端只需要知道具体建造者的类型。
- 一方面指挥者只负责控制产品的生成过程,针对的是建造者接口,即可以通过指挥者类调用建造者的相关方法来返回一个完整的对象。
2.模式结构
👉通常由一个建造者接口(
负责定义创建复杂产品对象的步骤
),多个具体的建造者实现类(负责实现创建复杂产品对象的步骤内部逻辑
),一个指挥者类(负责定义创建相应产品对象的组装方法
),一个具体的产品对象、一个客户类(负责调用来获取指定复杂对象
)共同组成。
3.实现代码
举例 💡 :假设一个房子的构建流程分为打地基、砌墙、盖顶三步,而对于不同的房子类型它们的各步骤实现细节是不一样的,那么这个搭建不同房子的过程我们就可以采用建造者模式来实现。
房子对象类
public class House{
private String foundation;
private String wall;
private String roof;
// get和set方法
...
}
房子建造者抽象类
public abstract class HouseBuilder {
public abstract void buildFoundation();
public abstract void buildWall();
public abstract void buildRoof();
public abstract House getHouse();
}
低房子建造实现类
public class LowHouseBuilder extends HouseBuilder{
private House house = new House();
@Override
public abstract void buildFoundation(){
house.setFoundation("给低房子打地基");
}
@Override
public abstract void buildWall(){
house.setWall("给低房子砌墙");
}
@Override
public abstract void buildRoof(){
house.setRoof("给低房子盖顶");
}
@Override
public abstract House getHouse(){
return house
}
}
高房子建造实现类
public class HighHouseBuilder extends HouseBuilder{
private House house = new House();
@Override
public abstract void buildFoundation(){
house.setFoundation("给高房子打地基");
}
@Override
public abstract void buildWall(){
house.setWall("给高房子砌墙");
}
@Override
public abstract void buildRoof(){
house.setRoof("给高房子盖顶");
}
@Override
public abstract House getHouse(){
return house
}
}
房子建造指挥类
public class HouseDirector {
private HouseBuilder houseBuilder;
public HouseDirector(HouseBuilder houseBuilder){
this.houseBuilder = houseBuilder;
}
public House buildHouse(){
houseBuilder.buildFoundation();
houseBuilder.buildWall();
houseBuilder.buildRoof();
return houseBuilder.getHouse();
}
}
客户类
// 测试客户端
public class HouseClient{
public static void main(String[] args) {
HouseDirector houseDirector1 = new HouseDirector(new LowHouseBuilder());
House lowHouse = houseDirector.buildHouse();
HouseDirector houseDirector2 = new HouseDirector(new HighHouseBuilder());
House highHouse = houseDirector2.buildHouse();
}
}
4.优点好处
- 客户端不必知道对象内部的构建细节,将对象本身与对象的创建过程进行了解耦。
- 相同的创建过程可以创建不同的产品对象,将对象的构建与对象的表示进行了解耦。
- 每一个具体建造者都相互独立,因此可以很容易的进行扩展,符合OCP原则。
5.缺点弊端
由于建造者模式所创建的对象一般具有较多的共同点,因此使用范围会受到一定的限制,如果对象内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,最终导致系统变得复杂。
6.应用场景
- 当需要创建的对象有复杂的内部结构,也就是对象的建造涉及许多步骤的时候使用。
- 当需要创建的对象中的属性具有依赖关系,需要指定其生成顺序时使用。
- 当需要隔离复杂对象的创建和使用,并想通过相同的创建过程创建不同类型的对象时使用。
7.应用示例
JDK源码中的StringBuilder类
Appendable在这里可以充当建造者接口:
AbstractStringBuilder在这里可以充当具体的建造者实现类: