简介
生成器模式(Builder Pattern)是一种创建型设计模式,用于构建复杂对象。它允许客户端通过指定不同类型的生成器来创建不同类型的对象,同时隐藏了对象的具体创建过程。
在不同的文献和讨论中,你可能会看到"构建者模式"和"生成器模式"这两个术语交替使用,但它们都指的是一种用于构建复杂对象的模式,这种模式允许客户端通过指定不同的生成器来创建不同类型的对象,同时隐藏了对象的具体创建过程。因此,可以认为构建者模式和生成器模式是同一个模式的不同叫法,它们在概念上是相同的。
生成器模式最早由Gamma、Helm、Johnson和Vlissides在1995年的《设计模式:可复用面向对象软件的基础》一书中提出。这本书是设计模式领域的经典之作,总结了22种常见的设计模式,其中包括生成器模式。
解决问题
生成器模式主要解决以下问题:
-
1.复杂对象的创建:当创建一个复杂对象时,可能会涉及到多个步骤和多个参数,使用生成器模式可以将这些步骤和参数封装在一个生成器类中,使得对象的创建过程更加简洁和清晰。
-
2.可扩展性:生成器模式允许通过添加新的生成器类来创建不同类型的对象,而无需修改现有的代码。这提高了代码的可扩展性和可维护性。
-
3.隐藏创建过程:生成器模式将对象的创建过程封装在生成器类中,客户端只需指定生成器的类型,无需了解具体的创建过程。这降低了客户端与具体实现之间的耦合度。
示例代码
以下是一个简单的生成器模式示例,以构建一个复杂对象,以汽车为例。
首先,定义一个汽车接口 和实现类:
java
public interface ICar {
void setWheel(String wheel);
void setEngine(String engine);
void setBody(String body);
void display();
}
java
public class Car implements ICar{
private String wheel;
private String engine;
private String body;
@Override
public void setWheel(String wheel) {
this.wheel = wheel;
}
@Override
public void setEngine(String engine) {
this.engine = engine;
}
@Override
public void setBody(String body) {
this.body = body;
}
@Override
public void display() {
System.out.println("Wheel: " + wheel);
System.out.println("Engine: " + engine);
System.out.println("Body: " + body);
}
接下来,定义一个生成器接口和实现类:
java
public interface ICarBuilder {
ICarBuilder buildWheel(String wheel);
ICarBuilder buildEngine(String engine);
ICarBuilder buildBody(String body);
ICar build();
}
java
public class CarBuilder implements ICarBuilder{
private ICar icar;
public CarBuilder(){
icar = new Car();
}
@Override
public ICarBuilder buildWheel(String wheel) {
icar.setWheel(wheel);
return this;
}
@Override
public ICarBuilder buildEngine(String engine) {
icar.setEngine(engine);
return this;
}
@Override
public ICarBuilder buildBody(String body) {
icar.setBody(body);
return this;
}
@Override
public ICar build() {
return icar;
}
}
客户端代码:
java
public class Client {
public static void main(String[] args) {
ICarBuilder builder = new CarBuilder();
ICar car = builder
.buildBody("big body")
.buildWheel("round wheel")
.buildEngine("strong engine")
.build();
car.display();
System.out.println("------------------------");
ICar car2 = builder
.buildBody("small body")
.buildWheel("round wheel")
.buildEngine("weak engine")
.build();
car2.display();
}
}
输出结果:
Wheel: round wheel
Engine: strong engine
Body: big body
------------------------
Wheel: round wheel
Engine: weak engine
Body: small body