[设计模式] 创建型:建造者模式(Builder Pattern)

什么是建造者模式

玩过橡皮泥没?玩过乐高积木没?橡皮泥、乐高积木,这两个东西就能充分体现建造者模式的含义。

相同的材料,不同的组装思路,能够得到花样的产品模型,这就是建造者模式最核心的思想。

建造者模式跟工厂模式很像,因为都是生产对象的模式,所以容易混淆在一起。它们的区别在于:

  1. 工厂模式侧重于用不同材料生产不同产品,关注材料多样性,不关注组装灵活性
  2. 建造者模式侧重于用相同材料组装成不同产品,关注组装灵活性,不关注材料多样性

模式设计与实现

通常情况下,使用建造者模式,会有三类角色概念:

  1. 产品类:这是最根本的角色,必须要有的,并且,产品在设计上应该具有可拆分、可组装的特性
  2. 建造者:可以根据规范说明,把零部件组装成产品的角色,就像是玩积木的小孩子
  3. 指挥者:掌握着产品设计需求,可以指挥建造者行动的角色,就像是引导孩子用乐高积木搭建出各种模型的家长

理清角色关系,掌握模式的核心要点以后,代码实现也有多种多样的选择。

因为产品是可拆分的,所以,很容易想到,在代码层面,类与类之间使用组合关系会更好。

代码实现大概是这个样子的吧:

// 产品类:为了少写点代码,属性定义为public
public class Product {
    public String partA;
    public String partB;
    public String partC;
}

// 建造者
public class Builder {
    // 根据需求规范建造产品
    public Product buildProduct(String partA, String partB, String partC) {
        Product product = new Product();
        product.partA = partA;
        product.partB = partB;
        product.partC = partC;
        return product;
    }
}

// 指挥者
public class Director {
    private Builder builder;
    public Director(Builder builder) { this.builder = builder; }
    // 产品模型1
    public Product getProduct1() {
        String partA = "1个红色的乐高积木";
        String partB = "2个黄色的乐高积木";
        String partC = "3个蓝色的乐高积木";
        return builder.buildProduct(partA, partB, partC);
    }
    // 产品模型2
    public Product getProduct2() {
        String partA = "10个白色的乐高积木";
        String partB = "20个黑色的乐高积木";
        String partC = "30个蓝色的乐高积木";
        return builder.buildProduct(partA, partB, partC);
    }
}

这段代码只是展示出建造者模式的基本概念和实现思路,实际使用当中,通常还会融入其它的设计模式,例如工厂方法、抽象模版方法等。

Builder类的设计看着和简单工厂模式很像吧?其实它俩只是代码写的像,逻辑含义是有区别的,主要体现在方法参数上:

  1. 简单工厂的参数含义是“哪一种类型的产品”
  2. 建造者方法的参数含义是“产品的成分是什么”

如果拿乐高举例,到目前为止,我们的指挥者Director可以搭建两种乐高模型。

如果要搭建更多不同样式的乐高模型,只需要在指挥者Director里面继续添加搭建方法,给出具体的模型搭建方案即可,产品类和建造者都不需要改动。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章