(四)、建造者模式

一、简介:

在软件设计中,有时候面临一个“复杂对象”的创建工作,其通常由各个部分的子对象用一定算法构成;
由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合到一起的算法稳定。

二、 建造者的具体体现

例如:电脑城的老板是直接和客户联系的,然而电脑的组装是由老板指挥装机人员去把电脑的各个部分
组装起来,真正负责创建电脑的人就是电脑城的装机人员,了解这些逻辑之后,下面就具体看下如何用
代码实现生活中的逻辑过程:



/**
 *客户类.
 */
public class Customer {
    public static void main(String[] args) {
        //客户找到电脑城老板说要买电脑,这里要装两台电脑

        //创建指挥者和构建者
        Director director = new Director();
        Builder builder1=new ConcreateBuilder1();
        Builder builder2=new ConcreateBuilder2();

        //老板叫员工去组装一台电脑
        director.buildeComputer(builder1);
        //组装完之,组装人员搬来组装好的电脑
        Computer computer1 = builder1.getComputer();
        computer1.show();


        //老板叫员工去组装第二台电脑
        director.buildeComputer(builder2);
        //组装完之后,组装人员搬来组装好的电脑
        Computer computer2 = builder2.getComputer();
        computer2.show();
    }
}


/**
 * 小王和小李都是电脑组装工,谁都不会自愿的去组装,这必须有一个
 * 人叫他们去组装才会去,当然这就是老板了,也就是建造者模式中的
 * 指挥者,指挥创建过程类
 */
public class Director {
    //组装电脑
    public void buildeComputer(Builder builder) {
        builder.buildPartCpu();
        builder.buildPartCpu();
    }
}

/**
 * 抽象建造者,这个场景下为"组装人",这里也可以定义为接口
 */
public abstract class Builder {
    //组装cpu
    protected abstract void buildPartCpu();
    //组装主板
    protected abstract void buildPartMainBoard();
    //组装还有硬盘,电源。。。


    //组装好了电脑
    protected abstract  Computer getComputer();
}


/**
 * 电脑类.
 */
public class Computer {
    //电脑组件集合
    private List<String> parts=new ArrayList<String>();

    //把单个组件添加到电脑组件集合中去
    public void add(String part){
        parts.add(part);
    }

    public void show(){
        System.out.println("电脑组装开始");
        for (String str : parts){
            System.out.println(str);
        }
        System.out.println("电脑组装好了。");
    }
}


/**
 *具体创建者,具体的某个人为具体创建者,例如:装机小李
 */
public class ConcreateBuilder1 extends Builder {
    Computer computer = new Computer();

    @Override
    protected void buildPartCpu() {
        computer.add("cpu1");
    }

    @Override
    protected void buildPartMainBoard() {
        computer.add("mainBoard1");
    }

    @Override
    protected Computer getComputer() {
        return computer;
    }
}


/**
 *具体创建者,具体的某个人为具体创建者,例如:装机小王
 */
public class ConcreateBuilder2 extends Builder {
    Computer computer = new Computer();

    @Override
    protected void buildPartCpu() {
        computer.add("cpu2");
    }

    @Override
    protected void buildPartMainBoard() {
        computer.add("mainBoard2");
    }

    @Override
    protected Computer getComputer() {
        return computer;
    }
}

运行结果:

电脑组装开始
cpu1
cpu1
电脑组装好了。
电脑组装开始
cpu2
cpu2
电脑组装好了。

三、建造者模式的定义和类图

这里写图片描述

四、建造者在java代码中的具体体现

StringBuilder类扮演着建造string对象的具体建造者角色,其中ToString()方法用来返回具体产品
给客户端(相当于上面代码中getComputer方法)。其中Append方法用来创建产品的组件(相当于
上面代码中BuildPartA和BuildPartB方法),因为string对象中每个组件都是字符,所以也就不需
要指挥者的角色的代码(指的是buildeComputer方法,用来调用创建每个组件的方法来完成整个产品的组装),
因为string字符串对象中每个组件都是一样的,都是字符,所以Append方法也充当了指挥者buildeComputer方法的作用。

五、总结

优点:

Builder模式解决的是: “分步骤构建一个复杂的对象,组合在一起的算法相对稳定”,而复杂对象的各个部分经常变化。

抽象工厂模式:解决系列对象的需求变化。

缺点:

Builder模式难以应对”分步构建算法的需求变动“。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值