创建型:建造者模式
目录
1、核心思想
2、实现方式
2.1 模式结构
2.2 工作流程
2.3 实现案例
2.4 变体:链式建造者(常见于多参数对象,无需指挥者)
3、优缺点分析
4、适用场景
1、核心思想
目的:将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
建造者的制造过程不仅要分步完成,还要按照顺序进行,所以建造者的各制造步骤与逻辑都应该被抽离出来独立于数据模型。
2、实现方式
2.1 模式结构
四个核心结构:
- Product(产品):复杂的产品类,构建过程相对复杂,需要其他组件组装而成。
- Builder(抽象建造者):建造者接口,定义了构成产品的各个组件的构建标准,通常有多个步骤。
- ConcreteBuilder(具体建造者):具体的建造者实现类,可以有多种实现,负责产品的组装但不包含整体建造逻辑。
- Director(指挥者):持有建造者接口引用的指导者类,指导建造者按一定的逻辑进行建造。
2.2 工作流程
客户端创建具体建造者实例,并传递给指挥者。
指挥者按预定步骤调用建造者的方法。
具体建造者逐步构建产品的各个部件。
最终由建造者返回组装完成的产品。
2.3 实现案例
假设构建一个House对象,步骤包括打地基、建墙、装屋顶和装修。不同房屋类型(如木屋、砖房)的建造细节不同,但流程一致。
每一个房屋的结构一致,施工方(具体建造者)不同,会导致最终的房屋产品类型不同。所以如果需要扩展建造的房屋类型,只需要扩展增加具体建造者的实现(比如砖房建造者等),符合开闭原则
// 1、产品类
class House {private String foundation;private String walls;private String roof;// 省略getter/setter
}// 2、抽象建造者
interface HouseBuilder {void buildFoundation();void buildWalls();void buildRoof();House getResult();
}// 3、具体建造者:木屋
class WoodHouseBuilder implements HouseBuilder {private House house = new House();public void buildFoundation() { house.setFoundation("Wood Foundation"); }public void buildWalls() { house.setWalls("Wood Walls"); }public void buildRoof() { house.setRoof("Wood Roof"); }public House getResult() { return house; }
}// 4、指挥者
class ConstructionDirector {public House construct(HouseBuilder builder) {builder.buildFoundation();builder.buildWalls();builder.buildRoof();return builder.getResult();}
}// 5、客户端使用
public class Client {public static void main(String[] args) {HouseBuilder builder = new WoodHouseBuilder();ConstructionDirector director = new ConstructionDirector();House house = director.construct(builder);}
}
2.4 变体:链式建造者(常见于多参数对象,无需指挥者)
// 产品类
class Person {private String name;private int age;// 其他属性...// 建造者作为静态内部类public static class Builder {private String name;private int age = 0; // 默认值public Builder(String name) { this.name = name; }public Builder age(int age) { this.age = age; return this; }public Person build() { return new Person(this); }}private Person(Builder builder) {this.name = builder.name;this.age = builder.age;}
}// 客户端使用
Person person = new Person.Builder("Alice").age(30).build();
3、优缺点分析
优点:
分离构建与表示:客户端无需了解内部构造细节。
灵活扩展:通过新增建造者支持新产品类型。
精细控制:分步骤构建,便于管理复杂对象的创建过程。
缺点:
代码冗余:需编写多个建造者类,增加代码量。
适用范围有限:仅当对象构造复杂或存在多种表示时适用。
4、适用场景
-
对象包含多个部件,且构建过程需相同步骤。
-
构造过程需支持不同配置或表示(如生成不同格式文档)。
-
需要创建的对象具有大量可选参数或复杂依赖。