Java基础

设计模式2.6 建造者模式

2018-11-30  本文已影响3人  卢卡斯哔哔哔

点击进入我的博客

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

2.6.1 建造者结构

建造者模式

2.6.2 建造者模式细节

主要目的

一个产品通常有不同的组成成分作为产品的零件,不同的产品可以有不同的零件,建造产品的过程是建造零件的过程。建造者模式将产品的结构和产品的零件建造过程对外隐藏起来,把对建造过程进行指挥的责任和具体建造零件的责任分割开来,达到责任划分和封装的目的。

解决问题

主要解决在开发过程中,有时需要创建一个复杂对象,通常由多个部分的子对象构成;由于复杂对象的多样性,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法需要保持稳定。

使用场景
  1. 肯德基的产品很多,需要组成“套餐”。
  2. Java的StringBuilder
省略角色
  1. 省略抽象建造者:如果只需要一个具体建造者,则可以省略抽象建造者。
  2. 省略指挥者:可以在具体建造者里边直接构造具体产品。
  3. 合并具体建造者和具体产品:在产品本身就是自己的建造者。
优点
  1. 良好的封装性
  2. 具体建造类之间独立,扩展性好
缺点

2.6.3 肯德基套餐案例

public class Waiter {
    public static void main(String[] args) {
        KFCBuilder builder = new MexicanTwisterBuilder();
        builder.buildBeverage();
        builder.buildHamburger();
        builder.buildSnack();
        KFCCombo combo = builder.getCombo();
    }
}

// 套餐接口
abstract class KFCCombo {
    private String hamburger;
    private String beverage;
    private String snack;
    // getters & setters
}
// 墨西哥鸡肉卷套餐
class MexicanTwisterCombo extends KFCCombo {}

// Builder接口
interface KFCBuilder {
    void buildHamburger();
    void buildBeverage();
    void buildSnack();
    KFCCombo getCombo();
}

class MexicanTwisterBuilder implements KFCBuilder {
    private KFCCombo combo = new MexicanTwisterCombo();
    @Override
    public void buildHamburger() {
        combo.setHamburger("Mexican Twister");
    }

    @Override
    public void buildBeverage() {
        combo.setBeverage("Pepsi Cola");
    }

    @Override
    public void buildSnack() {
        combo.setSnack("Hot Wings");
    }

    @Override
    public KFCCombo getCombo() {
        return combo;
    }
}

2.6.4 builder内部类

如果一个类有很多属性,此时为此类写一个Builder内部类,来辅助建造该类。

class Phone {
    private String screen;
    private String camera;
    private String cpu;
    private String battery;

    public static Builder builder() {
        return new Builder();
    }

    public static class Builder {
        private Phone phone = new Phone();

        public Builder screen(String screen) {
            phone.screen = screen;
            return this;
        }

        public Builder camera(String camera) {
            phone.camera = camera;
            return this;
        }

        public Builder cpu(String cpu) {
            phone.cpu = cpu;
            return this;
        }

        public Builder battery(String battery) {
            phone.battery = battery;
            return this;
        }

        public Phone build() {
            return phone;
        }
    }
}

2.6.5 与其他模式的关系

抽象工厂模式
策略模式
上一篇 下一篇

猜你喜欢

热点阅读