A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 大蓝鲸小蟀锅 于 2020-4-23 14:26 编辑

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


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

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


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


测试
[Java] 纯文本查看 复制代码
[/align]/**
 * 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] 纯文本查看 复制代码
[align=left][color=rgb(51, 51, 51)][font="][size=16px][b]建造者[/b][/size][/font][/color][/align]/**
 * 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] 纯文本查看 复制代码
[/align]/**
 * 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] 纯文本查看 复制代码
[/align]/**
 * 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] 纯文本查看 复制代码
[/align]/** * 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());    
}
}



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马