设计模式之建造者模式

2020-03-08  本文已影响0人  成为一个无趣的人

设计模式之建造者模式

1. 模式定义

建造者模式又可以成为生成器模式,它属于对象创建型模式。建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。它一步一步创建一个复杂对象,而且允许用户只通过指定复杂对象的类型和内容就可以构建他们,而不需要知道内部构建细节[1]

​ - [1] 图说设计模式

2. UML类图

建造者模式

3. 代码描述

package com.lemon.builder;

import lombok.Data;

/**
 * @author Hello
 * @description 复杂产品,由组件ABC构成
 * @date 2020-03-08 09:23
 */
@Data
public class Product {
    private Object componentA;
    private Object componentB;
    private Object componentC;
}
package com.lemon.builder;

/**
 * @author Hello
 * @description
 * @date 2020-03-08 09:22
 */
public abstract class AbstractBuilder {
    public abstract Object buildA();
    public abstract Object buildB();
    public abstract Object buildC();
}
package com.lemon.builder;

/**
 * @author Hello
 * @description 具体建造者A
 * @date 2020-03-08 09:22
 */
public class BuilderA extends AbstractBuilder{
    @Override
    public Object buildA() {
        return "建造者A建造的组件A";
    }

    @Override
    public Object buildB() {
        return "建造者A建造的组件B";
    }

    @Override
    public Object buildC() {
        return "建造者A建造的组件C";
    }
}
package com.lemon.builder;

/**
 * @author Hello
 * @description 具体建造者B
 * @date 2020-03-08 09:22
 */
public class BuilderB extends AbstractBuilder{
    @Override
    public Object buildA() {
        return "建造者B建造的组件A";
    }

    @Override
    public Object buildB() {
        return "建造者B建造的组件B";
    }

    @Override
    public Object buildC() {
        return "建造者B建造的组件C";
    }
}
package com.lemon.builder;

/**
 * @author Hello
 * @description 指挥者,负责直接与客户端交互,建造产品
 * @date 2020-03-08 09:23
 */
public class Director {
    private AbstractBuilder builder;

    public Director(AbstractBuilder builder) {
        this.builder = builder;
    }

    public Product build() {
        Product product = new Product();
        product.setComponentA(builder.buildA());
        product.setComponentB(builder.buildB());
        product.setComponentC(builder.buildC());
        return product;
    }
}

4. 举个栗子

直接看类图和代码可能还不够直观,理解起来有困难,那么我们还是举个栗子。假设你去奶茶店购买饮品,你对奶茶妹妹说,一杯珍珠奶茶,不加珍珠,七分糖。奶茶妹妹虽然一脸懵逼,但还是拿起了调制珍珠奶茶的杯子,加奶、加茶再加七分糖,至此,你的珍珠奶茶也就做好了。在这个过程中,你相当于客户类,奶茶妹妹相当于指挥者类,调制奶茶的杯子相当于具体建造者,假如该奶茶店还有牛奶、咖啡、水果茶等饮品,那么也应该有牛奶具体建造者、咖啡具体建造者、水果茶具体建造者。奶茶妹妹每次只需要更换代表具体建造者的杯子,就能按客户需求调制不同的饮品。

5.总结

  • 在建造者模式中,客户端不必知道产品内部的细节,将产品本身与产品的创建过程解耦,是的相同的创建过程可以创建不同的产品对象。
  • 每一个具体建造者都相对独立,因此可以很方便地替换具体建造者或新增具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
  • 可以更加精细地控制产品地创建过程。
  • 增加新的具体建造者无需修改原有类库地代码,指挥者针对抽象建造者编程,系统扩展方便,符合“开闭原则”。
  • 建造者模式所创建的产品一般具有较多相同的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式。
  • 如果产品地内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
上一篇 下一篇

猜你喜欢

热点阅读