(四)、建造者模式

来源:互联网 发布:hough变换检测圆算法 编辑:程序博客网 时间:2024/05/17 20:00

一、简介:

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

二、 建造者的具体体现

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

/** *客户类. */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;    }}运行结果:电脑组装开始cpu1cpu1电脑组装好了。电脑组装开始cpu2cpu2电脑组装好了。

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

这里写图片描述

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

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

五、总结

优点:

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

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

缺点:

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

原创粉丝点击