定义:
The intent of the Builder design pattern is to separate the construction of a complex object from its representation. By doing so the same construction process can create different representations.
将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
使用场景:
建造者模式适用于创建那些内部结构比较复杂的对象。建造者模式将复杂产品的构建过程封装分解在不同的方法中,使得创建过程非常清晰,能够让我们更加精确的控制复杂产品的创建过程,同时它隔离了复杂产品对象的创建和使用,使得相同的创建过程能够创建不同的产品。
优点:
使用建造者模式可以使客户端不必知道产品内部组成的细节。
具体的建造者类是相互独立的,这有利于系统的扩展。也可以对建造的过程逐步细化,而不会对其他模块产生任何影响。
缺点:
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
建造者UML类图:
代码如下:
我们要创建一件产品,它有name、num、model属性。省略getter、setter方法以及toString方法。
public class Product {
private String name;
private int num;
private String model;
}
抽象构建者类:
public abstract class Builder {
public abstract void setName();
public abstract void setNum();
public abstract void setModel();
public abstract Product getProduct();
}
构建者实现类:
public class ComputerBuilder extends Builder {
private Product product;
public ComputerBuilder(Product product) {
this.product = product;
}
@Override
public void setName() { product.setName("电脑"); }
@Override
public void setNum() {
product.setNum(5);
}
@Override
public void setModel() {
product.setModel("苹果6");
}
@Override
public Product getProduct() {
return product;
}
}
指导者类(Director):
public class ComputerDirector {
public void makeComputer(Builder builder){
builder.setName();
builder.setNum();
builder.setModel();
}
}
客户端:
public class Client {
public static void main(String[] args) {
ComputerDirector computerDirector = new ComputerDirector();
Builder build = new ComputerBuilder(new Product());
computerDirector.makeComputer(build);
Product product = build.getProduct();
System.out.println(product);
}
}
结果:
Product{name='电脑', num=5, model='苹果6'}