Appearance

建造者模式

coderzhouyu

什么是建造者模式?

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

实现类图

Product(产品类) :我们具体需要生成的类对象 Builder(抽象建造者类):为我们需要生成的类对象,构建不同的模块属性,即:公开构建产品类的属性,隐藏产品类的其他功能 ConcreteBuilder(具体建造者类):实现我们要生成的类对象 Director(导演类):用来固定建造者类,以及调用建造者类的方法来生成我们需要的类对象

建造者模式有哪些用法

建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式的优缺点

优点

  1. 建造者独立,易扩展
  2. 便于控制细节风险
  3. 建造者模式易于拓展,如果需要增加产品类,只需要增加一个具体的建造者即可
  4. 建造者模式将产品本身和产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象

缺点

  1. 产品必须有共同点,范围有限制
  2. 如果产品之间差异性很大,不适合使用建造者模式,因此其使用范围受到一定的限制
  3. 如果产品内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大

代码实现

/**
 * 产品类
 */
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;
    }
}
/**
 * 抽象建造者类
 */
public abstract class Builder {
    // 设置产品的不同部分,以获得不同的产品
    public abstract void setPart();

    // 建造产品
    public abstract Product buildProduct();
}
/**
 * 具体建造者类
 */
public class ConcreteBuilder extends Builder {
    private Product product = new Product();

    @Override
    public void setPart() {
        // 产品类内的逻辑处理 这部分逻辑也可以放到导演类中进行处理
    }

    @Override
    public Product buildProduct() {
        return product;
    }
}
/**
 * 导演类
 */
public class Director {
    private Builder builder = new ConcreteBuilder();

    // 构建不同的产品
    public Product getAProduct() {
        builder.setPart();
        /*
         * 设置不同的零件,产生不同的产品
         */
        return builder.buildProduct();
    }
}
/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        Director director = new Director();
        Product product = director.getAProduct();
        product.showProduct();
    }
}
Last Updated 2023/10/18 09:59:31