建造模式

建造(Builder)模式又称生成模式。它将一个复杂对象的构建过程和对象的表示过程分离开来。

建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

什么是内部表象?

《设计与模式》中是这样描述的:

“一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,他们通常又叫做产品的内部表象。不同的产品可以有不同的内部表象,也就是不同的零件。使用建造模式可以使客户端不需要知道所生成的产品有哪些零件,每个产品的对应零件彼此有何不同,是怎么建造出来的,以及怎样组成产品。”

再谈工厂模式

工厂模式也是对象的创建模式,通常我们利用工厂模式是直接创建一系列对象,但是工厂模式创建对象是:既包含创建过程,又包含了创建对象功能。比如创造人,工厂模式即创建了人(产品),也创建了人的组成部分(零件):手、脚和头。

而建造模式却解决了这一个问题,它将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。

类图及代码实现

各个部件及其作用

image

指挥者

  1. 作用:构建Builder对象接口的对象。指挥者调度具体的构建细节。
  2. 用于创建一些复杂对象(有建造细节,即有很多零件组成的产品)。
  3. 适用于对象内部构建过程和顺序比较稳定的过程。

建造者

  1. 作用:创建一个产品对象的各个部件的抽象接口。

具体建造者

  1. 实现Builder接口,描写各个部件的具体细节。

Product: 具体产品

类图

image
/*
 * 产品
 */
public class Product {
    private String parts;
    // 添加产品
    public void addParts(String s) {
        this.parts = s;
        System.out.println("建造:"+s);
    }
    public String toString() {
        return this.parts;
    }
}
/*
 * 建造者类接口
 */
public abstract class Builder {
    //封装了一个产品类的引用
    protected Product pr;
    // 构造方法,在创建建造者类对象的同时,也创建了产品类对象。
    public Builder(){
        pr = new Product();
    }
    
    // 返回产品对象
    public Product getProduct() {
        return pr;
    }
    // 创建各个部分零件的方法
    public abstract void buildPartA();
    public abstract void buildPartB();
    public abstract void buildPartC();
}

/*
 * 具体建造者
 */
public class ConcreteBuilderA extends Builder{
    public ConcreteBuilderA() {
        super();
        System.out.println("建造产品中"+"... ...");
    }

    @Override
    public void buildPartA() {
        pr.addParts("partA");
    }

    @Override
    public void buildPartB() {
        pr.addParts("partB");
    }

    @Override
    public void buildPartC() {
        pr.addParts("partC");
        
    }

}
/*
 * 指挥者
 */
public class Director {
    public void construct(Builder b) {
        // 顺序调用,依次组建产品的各个部分
        b.buildPartA();
        b.buildPartB();
        b.buildPartC();
        System.out.println("建造完成!");
    }
}
/*
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        // 创建一个指挥者对象
        Director d = new Director();
        // 创建一个具体构建者对象
        ConcreteBuilderA cbA = new ConcreteBuilderA();
        // 开始创建
        d.construct(cbA);
        // 获取已经创建的产品
        Product product = cbA.getProduct();
    }
}

你可能感兴趣的:(建造模式)