设计模式-构建者模式

概念

建造者模式(英:Builder Pattern)是一种创建型设计模式,又名:生成器模式。GOF 给建造者模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这句话说的比较抽象,其实解释一下就是:将建造复杂对象的过程和组成对象的部件解耦。

再通俗点讲,一个成型的鸡蛋饼就是那个复杂对象,里面的面饼,鸡蛋,培根什么的都是组件。在一个基础的组件(面饼)上任意加其他组件,这就是建造者模式。

用途

适用于那些可以组件分离的对象,就如上述中的鸡蛋饼,或者各类组合模型等等。还要注意的就是,简单的组件所组合成的多种复杂对象应该需要满足你的各类需求。

还是拿鸡蛋饼举例,你如果对外卖,加各种食材的人都有,这样的场景是合适的;而如果你只是做给自己吃,而且你还只吃那一两样,这种场景就不适合组合模式。

实际使用

//鸡蛋饼
public class Waffle {
    
        private boolean addEgg;       //鸡蛋
        private boolean addLettuce;   //生菜
        private boolean addBacon;     //培根

        Waffle(Builder builder) {
            this.addEgg = builder.addEgg;
            this.addLettuce = builder.addLettuce;
            this.addBacon = builder.addBacon;
        }

        public static class Builder {

            private boolean addEgg;       //鸡蛋
            private boolean addLettuce;   //生菜
            private boolean addBacon;     //培根

            public Builder() {

            }

            public Builder addEgg() {
                this.addEgg = true;
                return this;
            }

            public Builder addLettuce() {
                this.addLettuce = true;
                return this;
            }

            public Builder addBacon() {
                this.addBacon = true;
                return this;
            }

            public Waffle build() {
                return new Waffle(this);
            }
        }
}

使用

  //鸡蛋饼一个 加份培根
  Waffle waffle=new Waffle.Builder().addBacon().build();
  //鸡蛋饼一个 加份培根和鸡蛋
  Waffle waffle2=new Waffle.Builder().addBacon().addEgg().build();
  //鸡蛋饼一个 全部都加
  Waffle waffle3=new Waffle.Builder().addBacon().addEgg().addLettuce().build();

如果老板那天加了新的配菜也可以直接写在waffle这个类中,客户就可以直接调用了。

模式结构

  • Product:产品类,指要创建的复杂对象,通常实现了模板方法模式。
  • Builder:抽象建造类,规范产品的组建,一般是由子类实现的。
  • ConcreteBuilder:具体建造类,实现抽象建造类定义的方法并返回一个建造好的对象。
  • Director:导演类,也就是指挥者,负责安排流程。

[图片上传失败...(image-937359-1517411697420)]

[图片上传失败...(image-23b35f-1517411697420)]

优缺点

优点

  1. 建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。
  2. 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
  3. 可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
  4. 其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。符合开闭原则。

缺点

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

建造者模式与工厂模式的区别

我们可以看到,建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个”指挥者”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。

与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。

也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。

建造者模式与工厂模式类似,适用的场景也很相似。一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式。哈哈哈。。。

你可能感兴趣的:(设计模式-构建者模式)