黑马程序员技术交流社区

标题: 【南京校区】建造者模式(Builder Pattern) [打印本页]

作者: 大蓝鲸小蟀锅    时间: 2020-4-23 14:24
标题: 【南京校区】建造者模式(Builder Pattern)
本帖最后由 大蓝鲸小蟀锅 于 2020-4-23 14:26 编辑

建造者模式(Builder Pattern)
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序,一般用来创建更为复杂的对象
实现方式
(1)通过Client、Director、Builder和Product形成的建造者模式
(2)通过静态内部类方式实现零件无序装配话构造


第一种方式
通过Client、Director、Builder和Product形成的建造者模式
抽象建造者(Builder):描述具体建造者的公共接口,一般用来定义建造细节的方法,并不涉及具体的对象部件的创建。
具体建造者(ConcreteBuilder):描述具体建造者,并实现抽象建造者公共接口。
指挥者(Director):调用具体建造者来创建复杂对象(产品)的各个部分,并按照一定顺序(流程)来建造复杂对象。
产品(Product):描述一个由一系列部件组成较为复杂的对象。

具体代码
建造者
[Java] 纯文本查看 复制代码
/**
* Builder.java
*  建造者
*/
abstract class Builder {
    //打地基
    abstract void bulidA();
    //扎钢筋
    abstract void bulidB();
    //铺电线
    abstract void bulidC();
    //装修
    abstract void bulidD();
    //完工
    abstract Product getProduct();
}


产品
[Java] 纯文本查看 复制代码
/**
* Product.java
*  产品(大楼)
*/
public class Product {
    private String buildA;
    private String buildB;
    private String buildC;
    private String buildD;
    public String getBuildA() {
        return buildA;
    }
    public void setBuildA(String buildA) {
        this.buildA = buildA;
    }
    public String getBuildB() {
        return buildB;
    }
    public void setBuildB(String buildB) {
        this.buildB = buildB;
    }
    public String getBuildC() {
        return buildC;
    }
    public void setBuildC(String buildC) {
        this.buildC = buildC;
    }
    public String getBuildD() {
        return buildD;
    }
    public void setBuildD(String buildD) {
        this.buildD = buildD;
    }
    @Override
        public String toString() {
            return buildA+"\n"+buildB+"\n"+buildC+"\n"+buildD+"\n"+"大楼完成";
        }
}


具体建造者
[Java] 纯文本查看 复制代码
/**
* ConcreteBuilder.java
*  具体建造者
*/
public class ConcreteBuilder extends Builder{
    private Product product;
    public ConcreteBuilder() {
        product = new Product();
    }
    @Override
    void bulidA() {
        product.setBuildA("打地基");
    }
    @Override
    void bulidB() {
        product.setBuildB("扎钢筋");
    }
    @Override
    void bulidC() {
        product.setBuildC("铺电线");
    }
    @Override
    void bulidD() {
        product.setBuildD("装修");
    }
    @Override
    Product getProduct() {
        return product;
    }
}


指挥者
[Java] 纯文本查看 复制代码
/**
* Director.java
*  指挥者
*/
public class Director {
    //指挥工人按顺序造大楼
    public Product create(Builder builder) {
        builder.bulidA();
        builder.bulidB();
        builder.bulidC();
        builder.bulidD();
        return builder.getProduct();
    }
}


测试
[Java] 纯文本查看 复制代码
/**
* Test.java
*  测试类
*/
public class Test {
    public static void main(String[] args) {
        Director director = new Director();
        Product create = director.create(new ConcreteBuilder());
        System.out.println(create.toString());
    }
}

第二种方式
主要有三个角色:抽象建造者、具体建造者、产品
比第一种方式少了指挥者,主要是因为第二种方式把指挥者交给用户来操作,使得产品的创建更加简单灵活。
具体代码
[Java] 纯文本查看 复制代码
建造者
/**
* Builder.java
*  建造者
*/
abstract class Builder {
    //面包
    abstract Builder bulidA(String mes);
    //饮料
    abstract Builder bulidB(String mes);
    //鸡腿
    abstract Builder bulidC(String mes);
    //甜点
    abstract Builder bulidD(String mes);
    //获取套餐
    abstract Product build();
}


产品
[Java] 纯文本查看 复制代码
/**
* Product.java
*  产品(套餐)
*/
public class Product {
    private String buildA="面包";
    private String buildB="饮料";
    private String buildC="鸡腿";
    private String buildD="甜点";
    public String getBuildA() {
        return buildA;
    }
    public void setBuildA(String buildA) {
        this.buildA = buildA;
    }
    public String getBuildB() {
        return buildB;
    }
    public void setBuildB(String buildB) {
        this.buildB = buildB;
    }
    public String getBuildC() {
        return buildC;
    }
    public void setBuildC(String buildC) {
        this.buildC = buildC;
    }
    public String getBuildD() {
        return buildD;
    }
    public void setBuildD(String buildD) {
        this.buildD = buildD;
    }
    @Override
        public String toString() {
            return buildA+"\n"+buildB+"\n"+buildC+"\n"+buildD+"\n"+" 构成超级套餐";
        }
}


具体建造者
[Java] 纯文本查看 复制代码
/**
* ConcreteBuilder.java
*  具体建造者(服务员)
*/
public class ConcreteBuilder extends Builder{
    private Product product;
    public ConcreteBuilder() {
        product = new Product();
    }

    @Override
    Product build() {
        return product;
    }

    @Override
    Builder bulidA(String mes) {
        product.setBuildA(mes);
        return this;
    }

    @Override
    Builder bulidB(String mes) {
        product.setBuildB(mes);
        return this;
    }

    @Override
    Builder bulidC(String mes) {
        product.setBuildC(mes);
        return this;
    }

    @Override
    Builder bulidD(String mes) {
        product.setBuildD(mes);
        return this;
    }
}


测试
[Java] 纯文本查看 复制代码
/** * Test.java *  测试类 */
public class Test
{   
public static void main(String[] args) {         
ConcreteBuilder concreteBuilder = new ConcreteBuilder();         
Product build = concreteBuilder               
.bulidA("面包")//            
.bulidB("可乐")               
.bulidD("蛋挞")               
.build();        
System.out.println(build.toString());   
}
}








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2