国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > php教程 > 五,建造者模式

五,建造者模式

来源:程序员人生   发布时间:2016-11-19 14:42:09 阅读次数:2731次

建造者模式

建造者模式可以将1个产品的内部表象与产品的生成进程分割开来,从而可使1个建造进程生成具有不同的内部表象的产品对象。如果我们用了建造者模式,那末用户就只需指定需要建造的类型就能够得到它们,而具体建造的进程和细节就不需要知道。

建造者模式基础类图结构

建造者模式中存在的角色

  • 抽象建造者:给出1个接口,或是1个抽象类,以规范产品对象的各个组成成份的建造。模式中直接创建产品对象的是具体建造者角色。具体建造者角色必须要实现抽象建造者的两个方法:1种是建造方法,2是结果返回方法。
  • 具体建造者:担负这个角色的是与利用程序紧密相干的1些类,它们在利用程序调用下创建产品的实例。它的任务如上抽象建造者提到的1是建造方法,2是结果返回方法。
  • 导演者角色:担负这个角色的类调用具体建造者角色以创建产品对象,应当指出的是,导演者角色并没有产品类的具体知识,真正具有产品类的是具体建造角色。
  • 产品角色:1个系统中会有过剩1个的产品类,而且这些产品类其实不1定有共同的接口,而且可以完全不相干联的。

导演者角色是与客户端打交道的角色。导演者角色将客户端创建产品的要求划分为对各个零件的建造要求,再将这些要求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但是却不为客户端所知。

建造者模式源代码实现

产品角色

package com.designpattern.builder;

/**
 * Created by Administrator on 2016/9/21.
 */
public class Product {
    private String part1;
    private String part2;

    public String getPart1() {
        return part1;
    }

    public void setPart1(String part1) {
        this.part1 = part1;
    }

    public String getPart2() {

        return part2;
    }

    public void setPart2(String part2) {
        this.part2 = part2;
    }

    @Override
    public String toString() {
        return "Product{" +
                "part1='" + part1 + '\'' +
                ", part2='" + part2 + '\'' +
                '}';
    }
}

抽象建造者角色

package com.designpattern.builder;

/**
 * Created by Administrator on 2016/9/21.
 */
abstract public class Builder {

    public abstract void buildPart1();

    public abstract void buildPart2();

    public abstract Product retrieveResult();
}

具体建造者角色

package com.designpattern.builder;

/**
 * Created by Administrator on 2016/9/21.
 */

public class ConcreteBuilder extends Builder {

    private Product product = new Product();

    @Override
    public void buildPart1() {
        System.out.println("part1部份被创建");
        product.setPart1("part1");
    }

    @Override
    public void buildPart2() {
        System.out.println("part2部份被创建");
        product.setPart2("part2");
    }

    @Override
    public Product retrieveResult() {
        return product;
    }
}

导演者角色

package com.designpattern.builder;

/**
 * Created by Administrator on 2016/9/21.
 */
public class Director {
    private Builder builder;

    public Product construct(Builder builder){
        builder.buildPart1();
        builder.buildPart2();
        Product product = builder.retrieveResult();
        return product;
    }
}

客户端调用

package com.designpattern.builder;

/**
 * Created by Administrator on 2016/9/21.
 */
public class Client {
    public static void main(String[] args) {
        Director director = new Director();
        Builder builder = new ConcreteBuilder();
        Product product = director.construct(builder);
        System.out.println(product);
    }
}

多产品的建造者模式

具体建造角色分成A和B分别用来建造产品A和产品B,本来这个具体建造者角色可以设计成1个,但是如果系统中产品类增加的话,我们就要在这个具体建造者类中添加增加的产品的建造方法,不符合软件设计的“开——闭”原则,所以,我采取了1个具体建造者负责1个具体产品类。

建造者模式与抽象工厂模式比较

建造者模式跟抽象工厂模式类似,都是用来创建同时属于几个产品族的对象的模式。但是抽象工厂模式中,每次工厂对象被调用时都会返回1个完全的产品对象,客户端可能会用这个对象跟其他的对象组成更大更复杂的对象。而建造者模式是1点1点建造出1个复杂的产品,建造的进程产生的建造者角色内部,客户端拿到的就是1个完全的对象。

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生