一、什么是生成器模式?
生成器模式是一种创建型设计模式,它一步步构造一个复杂对象,而不需要将其构造过程暴露给客户端,使得构造过程和实例化过程分离。
生成器通过提供逐步构建对象的接口,使得代码更加清晰高效。生成器将对象构建细节隐形化,将对象的构建和表示分离,更加灵活,易于扩展。
通常情况下创建复杂对象时,我们需要一些独立的步骤,且这些步骤的顺序不能够变更。生成器模式依照这一思路实现了对象的逐步创建过程。
二、生成器模式的优点
生成器模式带来的好处不仅仅是将对象构建和实例化过程分离,其优点包括:
1、对象的构造得以应对变化。
2、使得构造代码更加可读、可维护、灵活。
3、将对象的构建和表示分离,可增加代码复用性。
4、创建建设过程封装在一个对象内。
三、生成器模式的实现步骤:
可以通过以下步骤实现生成器模式。
定义一个生成器接口:
public interface Builder {
void buildPartA(String partA);
void buildPartB(String partB);
void buildPartC(String partC);
Product getResult();
}
其中getResult()方法返回最终构建的对象实例。其他的方法定义对象构建的不同部分。
创建一个具体的生成器:
public class ConcreteBuilder implements Builder {
private Product product = new Product();
@Override
public void buildPartA(String partA) {
product.setPartA(partA);
}
@Override
public void buildPartB(String partB) {
product.setPartB(partB);
}
@Override
public void buildPartC(String partC) {
product.setPartC(partC);
}
@Override
public Product getResult() {
return product;
}
}
定义一个具体的生成器类,它实现了生成器接口并实现对象的构造方法。一个对象的构建过程和表示过程都交由它来实现。
四、生成器模式的代码实现
Builder接口代码:
public interface Builder {
void buildPartA(String partA);
void buildPartB(String partB);
void buildPartC(String partC);
Product getResult();
}
Product类代码:
public class Product {
private String partA;
private String partB;
private String partC;
public String getPartA() {
return partA;
}
public void setPartA(String partA) {
this.partA = partA;
}
public String getPartB() {
return partB;
}
public void setPartB(String partB) {
this.partB = partB;
}
public String getPartC() {
return partC;
}
public void setPartC(String partC) {
this.partC = partC;
}
}
ConcreteBuilder类代码:
public class ConcreteBuilder implements Builder {
private Product product = new Product();
@Override
public void buildPartA(String partA) {
product.setPartA(partA);
}
@Override
public void buildPartB(String partB) {
product.setPartB(partB);
}
@Override
public void buildPartC(String partC) {
product.setPartC(partC);
}
@Override
public Product getResult() {
return product;
}
}
Director类代码:
public class Director {
public Product constructProduct(Builder builder) {
builder.buildPartA("A");
builder.buildPartB("B");
builder.buildPartC("C");
Product product = builder.getResult();
return product;
}
}
客户端代码:
public class Client {
public static void main(String[] args) {
Director director = new Director();
Builder builder = new ConcreteBuilder();
Product product = director.constructProduct(builder);
System.out.println(product.getPartA() + product.getPartB() + product.getPartC());
}
}
五、什么时候使用生成器模式?
当需要创建复杂、可变、对客户端屏蔽实例化细节的对象时,可以考虑使用生成器模式。
如果对象拥有很多属性,并且这些属性都有可能被修改,则可以使用生成器模式使得对象的创建和构造更加简单和可靠。
在产品的构建过程中,可能存在不同的表示。生成器模式可实现对象的逐步创建和扩展。
六、生成器模式和工厂模式有何不同?
和工厂模式相比,生成器模式区别不大。两种模式都是用于创建复杂对象的。
但是,在使用工厂模式时,我们创建对象的过程完全依赖于工厂方法,而生成器模式则提供了一种更加灵活、可扩展和可控制的创建对象的方式,使得对象的创建过程更加优雅。
七、结论
通过使用生成器模式,我们可以使得对象的创建和构造更加简单、易于维护、可扩展和可维护。该模式将对象的构建和表示分离,使得代码更加清晰高效。
将对象的构造和实例化过程分离,避免将构造过程暴露给客户端,最终导致代码的混乱难以维护。