建造者模式

一)故事
变化是永恒的

二)定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(也叫生成器模式)

三)代码例子
共计五个类:1)抽象产品类;2)具体产品类(可多个);3)抽象建造者类;4)具体建造者类(可多个);5)导演类(用于封装Builder具体类);
1)抽象产品类
/**
 *  抽象产品类
 *
 * @author levovo
 */
public abstract class AbsProduct {
    private ArrayList<String> sequence = new ArrayList<>();
    // 产品类的公共方法
    public void method1() {
        System.out.println("AbsProduct()->method1()");
        int len = sequence.size();
        for (int n = 0; n < len; n++) {
            System.out.println("AbsProduct()->method1():"+sequence.get(n));
        }
    }
    // 抽象方法
    public abstract void method2();
    // 设置List
    public void setPart(ArrayList<String> _sequence) {
        this.sequence = _sequence;
    }
}

2)具体产品类(可多个)
/**
 *  具体产品类1
 * 
 * @author levovo
 */
public class ConcreteProduct1 extends AbsProduct {
    @Override
    public void method2() {
        // 业务逻辑处理
        System.out.println("ConcreteProduct1()->method2()");
    }
}

/**
 *  具体产品类2
 * 
 * @author levovo
 */
public class ConcreteProduct2 extends AbsProduct {
    @Override
    public void method2() {
        // 业务逻辑处理
        System.out.println("ConcreteProduct2()->method2()");
    }
}

3)抽象建造者类
/**
 *  抽象建造者类
 * 
 * @author levovo
 */
public abstract class AbsBuilder {
    // 设置产品的不同部分,以获得不同的产品
    public abstract void setPart(ArrayList<String> sequence);
    // 建造产品
    public abstract AbsProduct buildProduct();
}

4)具体建造者类(可多个)
/**
 *  具体建造者类1
 *
 * @author levovo
 */
public class ConcreteBuilder1 extends AbsBuilder {
    private AbsProduct product = new ConcreteProduct1();
    
    @Override
    public void setPart(ArrayList<String> sequence) {
        product.setPart(sequence);
    }
    
    @Override
    public AbsProduct buildProduct() {
        return product;
    }
}

/**
 *  具体建造者类2
 *
 * @author levovo
 */
public class ConcreteBuilder2 extends AbsBuilder {
    private AbsProduct product = new ConcreteProduct2();
    @Override
    public void setPart(ArrayList<String> sequence) {
        product.setPart(sequence);
    }
    
    @Override
    public AbsProduct buildProduct() {
        return product;
    }
}

5)导演类(用于封装Builder具体类)
/**
 *  导演类,用于封装Builder具体类
 *
 * @author levovo
 */
public class Director {
    private ArrayList<String> sequence = new ArrayList<>();
    private AbsBuilder builder1 = new ConcreteBuilder1();
    private AbsBuilder builder2 = new ConcreteBuilder2();
    // 建造产品1
    public AbsProduct getConcreteProduct1() {
        sequence.clear();
        sequence.add("A");
        sequence.add("B");
        sequence.add("C");
        builder1.setPart(sequence);
        return builder1.buildProduct();
    }
    // 建造产品2
    public AbsProduct getConcreteProduct2() {
        sequence.clear();
        sequence.add("C");
        sequence.add("A");
        sequence.add("B");
        builder2.setPart(sequence);
        return builder2.buildProduct();
    }
}

场景使用例子:
/**
 *  场景使用例子
 *
 * @author levovo
 */
public class Client {
    public static void main(String[] args) {
        Director director = new Director();
        AbsProduct product1 = director.getConcreteProduct1();
        product1.method1();
        product1.method2();
        AbsProduct product2 = director.getConcreteProduct2();
        product2.method1();
        product2.method2();
    }
}

四)优点
1)封装性
使用建造者模式可以使客户端不必知道产品内部组成的细节。如例子中我们就不需要关心每个具体的模型内部是如何实现的,产生的对象类型就是CarModel。
2)建造者独立,容易扩展
BenzBuilder和BMWBuilder是相互独立的,对系统的扩展非常有利。
3)便于控制细节风险
由于具体的建造者是独立的,因此可以对建造者过程逐步细化,而不对其他的模块产生任何影响。

五)缺点

六)使用场景
1)相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
2)多个部件或者零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
4)在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用创建者模式封装该对象的过程,该种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,,而要通过建造者模式柔化创建过程,本身已经违反设计的最初目标。

七)注意事项
建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建者模式,这是注重点不同。

八)扩展

九)总结
建造者模式最主要的功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗地说就是零件的装配,顺序不同产生的对象也不同,而工厂方法则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值