建造者模式(Builder Pattern)的核心在于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这个模式被用来解决当一个对象需要多个部分来一步步构建时,而且每个部分的构建复杂度不一,或者对象的构建需要遵循特定的顺序时的问题。通过建造者模式,可以让客户端不需要知道内部构建的细节。
建造者模式通常包含以下几个核心组成部分:
- 产品(Product):最终要构建的复杂对象。
- 建造者(Builder):接口声明了创建产品对象各个部分的方法。
- 具体建造者(Concrete Builder):实现Builder接口,提供构建过程的具体实现,并负责提供产品的最终实例。
- 指挥者(Director):负责安排已有模块的构建顺序,然后向Builder对象指挥构建过程,但它不涉及具体产品的信息。
- 客户端(Client):使用指挥者和建造者来创建一个对象。
使用建造者模式的优点包括:
- 封装性好:用户可以不知道产品内部组成的细节,将产品本身与产品的创建过程解耦。
- 建造者独立,易扩展:具体的建造者类之间独立,对系统的扩展有利。
- 便于控制细节风险:由于具体的建造者是独立的,因此可以控制产品的构建过程,以减少构建错误的风险。
建造者模式的核心在于分步骤构建一个复杂对象,并允许用户只通过指定复杂对象的类型和内容就可以构建它们,隐藏了对象的创建细节和过程。
在Java中使用建造者设计模式来实现建房子的过程,可以分为几个步骤:定义房子(Product),定义建造房子的步骤(Builder接口),提供具体的建造者(ConcreteBuilder),指挥者(Director)来控制建造过程,以及最后由客户端(Client)来创建对象。
下面是一个简化的示例,展示如何实现这个模式:
1. 首先定义房子
/**
* @author 曹见朋
* @create 2024-02-25-9:39
*/
@Data
public class House {
private String basic;
private String walk;
private String roof;
}
2. 其次定义抽象建造者
/**
* @author 曹见朋
* @create 2024-02-25-9:39
*/
public interface Build {
void buildBasic();
void buildWalk();
void buildRoof();
House getHouse();
}
3. 然后定义具体建造者
/**
* @author 曹见朋
* @create 2024-02-25-9:48
*/
public class BuildLittleHouse implements Build{
private House house;
public BuildLittleHouse() {
this.house = new House();
}
@Override
public void buildBasic() {
System.out.println("建造小屋的地基...");
house.setBasic("小屋地基");
}
@Override
public void buildWalk() {
System.out.println("建造小屋的墙体...");
house.setWalk("小屋的墙体");
}
@Override
public void buildRoof() {
System.out.println("建造小屋的屋顶...");
house.setRoof("小屋的屋顶");
}
@Override
public House getHouse() {
return this.house;
}
}
/**
* @author 曹见朋
* @create 2024-02-25-10:04
*/
public class BuildBigHouse implements Build{
private House house;
public BuildBigHouse() {
this.house=new House();
}
@Override
public void buildBasic() {
System.out.println("建造大房子的地基");
house.setBasic("大房子的地基");
}
@Override
public void buildWalk() {
System.out.println("建造大房子的墙体");
house.setBasic("大房子的墙体");
}
@Override
public void buildRoof() {
System.out.println("建造大房子的屋顶");
house.setBasic("大房子的屋顶");
}
@Override
public House getHouse() {
return this.house;
}
}
4. 定义指挥者
/**
* @author 曹见朋
* @create 2024-02-25-9:53
*/
public class Director {
private Build build;
public Director() {
}
public Director(Build build) {
this.build = build;
}
public House constructHouse(){
build.buildBasic();
build.buildWalk();
build.buildRoof();
return build.getHouse();
}
}
5. 定义客户端
/**
* @author 曹见朋
* @create 2024-02-25-9:55
*/
public class Client {
public static void main(String[] args) {
Build build = new BuildLittleHouse();
Director director = new Director(build);
House house = director.constructHouse();
System.out.println(house);
System.out.println("===================");
BuildBigHouse buildBigHouse = new BuildBigHouse();
Director director1 = new Director(buildBigHouse);
House house1 = director.constructHouse();
System.out.println(house1);
}
}
6. 运行
建造小屋的地基...
建造小屋的墙体...
建造小屋的屋顶...
House(basic=小屋地基, walk=小屋的墙体, roof=小屋的屋顶)
===================
建造小屋的地基...
建造小屋的墙体...
建造小屋的屋顶...
House(basic=小屋地基, walk=小屋的墙体, roof=小屋的屋顶)
Process finished with exit code 0