建造者模式

建造者模式

是什么?

建造者模式(Builder Pattern)是一种设计模式,又名:生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 ——维基百科

建造者模式的概念有点抽象…

先来简单介绍一下建造者模式中的几个角色概念

建造者模式中的几个角色

  • Product:表示被构造的复杂对象,这个比较好理解,就是需要构建的对象

  • Builder:为构建一个Product对象的各个部分指定抽象接口,面向接口编程嘛,提高代码可复用性(其实不用也行~)

  • ConcreteBuilder:具体的构造者实现类,负责具体化其对应产品各部分的构造细节(负责具体干活的)

  • Director:总监类,负责创建对象的各个部分的构造,但只涉及到构造顺序,并不涉及到具体的构造细节,这个人如其名,总监嘛,指挥就行,具体的脏活累活要交给手下做,手下就是具体的构造者实现类了

这么说还是比较抽象,下面写个简单的demo理解一下,看一下类图,有两种Product,所以对应的ConcreteBuilder也有两个

怎么用?

在这里插入图片描述

IProduct.java

/**
 * 产品接口
 */
public interface IProduct {
    void show();
}

ProductA.java

/**
 * 产品A
 */
public class ProductA implements IProduct {

    @Override
    public void show() {
        System.out.println("我是ProductA");
    }
}

ProductB.java

/**
 * 产品B
 */
public class ProductB implements IProduct {

    @Override
    public void show() {
        System.out.println("我是ProductB");
    }
}

IBuilder.java

/**
 * Builder接口
 */
public interface IBuilder {
    //公共构造步骤1/2/3
    void doConstruct1();

    void doConstruct2();

    void doConstruct3();

    //构造产品
    IProduct build();
}

ProductABuilder.java

/**
 * 产品A的Builder
 */
public class ProductABuilder implements IBuilder {
    private IProduct IProduct = new ProductA();

    @Override
    public void doConstruct1() {
        System.out.println("构造ProductA步骤1");
    }

    @Override
    public void doConstruct2() {
        System.out.println("构造ProductA步骤2");
    }

    @Override
    public void doConstruct3() {
        System.out.println("构造ProductA步骤3");
    }

    @Override
    public IProduct build() {
        return IProduct;
    }
}

ProductBBuilder.java

/**
 * 产品B的Builder
 */
public class ProductBBuilder implements IBuilder {
    private IProduct product = new ProductB();

    @Override
    public void doConstruct1() {
        System.out.println("构造ProductB步骤1");
    }

    @Override
    public void doConstruct2() {
        System.out.println("构造ProductB步骤2");
    }

    @Override
    public void doConstruct3() {
        System.out.println("构造ProductB步骤3");
    }

    @Override
    public IProduct build() {
        return product;
    }
}

Director.java

/**
 * 总监类,用于指挥构造过程
 */
public class Director {
    private IBuilder IBuilder = null;


    public Director(IBuilder builer) {
        this.IBuilder = builer;
    }

    // 构造过程
    public void construct() {
        IBuilder.doConstruct1();
        IBuilder.doConstruct2();
        IBuilder.doConstruct3();
    }
}

Test.java

/**
 * 测试demo
 */
public class Test {
    public static void main(String[] args) {
        IBuilder builderA = new ProductABuilder();
        Director director = new Director(builderA);
        director.construct();
        IProduct productA = builderA.build();
        productA.show();
    }
}

什么时候用?

  1. 产品类中的方法调用顺序不同会产生不同的结果。

  2. 初始化一个对象很复杂,如使用多个构造方法,或者说有很多参数,并且都有默认值时。

优缺点

优点:扩展性好,面向接口编程,一定程度上实现了解耦

缺点:应该比较明显了,每多一个产品就需要创建对应的Builder类,而且每次产品发生变化都需要需改Builder,比较麻烦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值