目录
1. 说明 2. 应用场景 3. 结构图 4. 构成 5. 适用性 6. 优点 7. 缺点 8. java示例
1. 说明
1.生成器模式(Builder Pattern),也称为建造者模式 ,是设计模式中的一种创建型模式 。 2.将一个复杂对象 的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 3.它主要用于构建复杂对象 ,通过将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。 4.
2. 应用场景
1.当一个类的构造函数包含多个参数 ,或者这些参数是相互依赖的,或者创建对象的步骤很多时,使用生成器模式可以简化对象的创建过程 。 2.当创建的复杂对象内部状态之间的变化相互依赖时,使用生成器模式可以更加灵活 地构建对象。 3.当一个对象需要被构建成不同的表示时,使用生成器模式可以轻松地通过不同的生成器来创建不同的表示。
3. 结构图
4. 构成
1.抽象生成器 (Builder)角色:为创建一个Product对象的各个部件指定抽象接口。 2.具体生成器 (Concrete Builder)角色:实现 Builder 的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口。 3.指挥者 (Director)角色(可选):构造一个使用 Builder 接口的对象。负责安排已有模块的顺序,然后告诉Builder开始构建。 4.产品 (Product)角色:表示被构建的复杂对象。它包含多个组成部件的声明,如汽车的轮子、引擎和车身等。
5. 适用性
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 2.当构造过程必须允许被构造的对象有不同的表示时。 3.当一个类的构造函数包含多个参数,或者这些参数是相互依赖的,或者创建对象的步骤很多时,使用生成器模式可以简化对象的创建过程。 4.当创建的复杂对象内部状态之间的变化相互依赖时,使用生成器模式可以更加灵活地构建对象。 5.当一个对象需要被构建成不同的表示时,使用生成器模式可以轻松地通过不同的生成器来创建不同的表示。
6. 优点
1.封装性:生成器模式封装了复杂对象的创建过程,使得客户端代码更加简洁。 2.灵活性:通过提供不同的生成器,可以创建不同的对象,而无需修改现有的构建代码。 3.可维护性:由于构建过程被分离出来,因此更容易理解和维护。 4.可扩展性:能够轻松地扩展新类型的对象,而无需修改现有的代码结构。
7. 缺点
1.造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
8. java示例
public class Person {
private String name;
private int age;
private String email;
// 私有构造函数,防止外部直接实例化
private Person(PersonBuilder builder) {
this.name = builder.name;
this.age = builder.age;
this.email = builder.email;
}
// Getter方法
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getEmail() {
return email;
}
// Builder内部类
public static class PersonBuilder {
private String name;
private int age;
private String email;
// 链式方法设置属性
public PersonBuilder withName(String name) {
this.name = name;
return this;
}
public PersonBuilder withAge(int age) {
this.age = age;
return this;
}
public PersonBuilder withEmail(String email) {
this.email = email;
return this;
}
// 构建Person对象
public Person build() {
return new Person(this);
}
}
// 为了方便使用,提供一个静态方法返回PersonBuilder实例
public static PersonBuilder builder() {
return new PersonBuilder();
}
}
public class BuilderPatternDemo {
public static void main(String[] args) {
Person person = Person.builder()
.withName("John Doe")
.withAge(30)
.withEmail("johndoe@example.com")
.build();
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
System.out.println("Email: " + person.getEmail());
}
}