安卓系列之设计模式:建造者模式

111 阅读2分钟

建造者者模式,属于创建型模式。

描述

若某种类型的很多类有很多共同点且是必须知道的点,然后有部分相同的属性和部分不同的属性,那么可以用这种模式。

常见实例

1.glide图片框架
2.StringBuilder
3.Retrofit网络框架

常见构建方法

具体代码

package com.elaine.testpattern.builder;

/**
 * 常见建造者模式
 *
 * @auther elaine
 */
public class DefaultProduct {
    //产品名字(必填)
    private final String productName;
    //公司名字(必填)
    private final String companyName;
    //用户群体(可填)
    private final String user;
    //备注(可填)
    private final String note;

    public DefaultProduct(Builder builder) {
        this.productName = builder.productName;
        this.companyName = builder.companyName;
        this.user = builder.user;
        this.note = builder.note;
    }

    public static class Builder {
        //产品名字(必填)
        private final String productName;
        //公司名字(必填)
        private final String companyName;
        //用户群体(可填)
        private String user;
        //备注(可填)
        private String note;

        public Builder(String productName, String companyName) {
            this.productName = productName;
            this.companyName = companyName;
        }

        public Builder setUser(String user) {
            this.user = user;
            return this;
        }

        public Builder setNote(String note) {
            this.note = note;
            return this;
        }

        public DefaultProduct build() {
            return new DefaultProduct(this);
        }
    }

    public String getCompanyName() {
        return companyName;
    }

    public String getProductName() {
        return productName;
    }

    public String getUser() {
        return user;
    }

    public String getNote() {
        return note;
    }

    @Override
    public String toString() {
        return "DefaultProduct{" +
                "productName='" + productName + ''' +
                ", companyName='" + companyName + ''' +
                ", user='" + user + ''' +
                ", note='" + note + ''' +
                '}';
    }
}

运行代码

DefaultProduct defaultProduct = new DefaultProduct.Builder("普通产品""普通产品公司名")//必传
                .setUser("普通产品用户群体")//可选
                .setNote("普通产品备注")//可选
                .build();
Log.e("defaultProduct==", defaultProduct.toString());

运行结果

图片

经典Builder模式

对象

package com.elaine.testpattern.builder;

/**
 * 产品实体
 *
 * @author elaine
 * @date 2020/7/28
 */
public class Product {
    //产品名字(必填)
    private String productName;
    //公司名字(必填)
    private String companyName;
    //用户群体(可填)
    private String user;
    //备注(可填)
    private String note;

    //必传参数的构建方法
    public Product(String productName, String companyName) {
        this.productName = productName;
        this.companyName = companyName;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

    @Override
    public String toString() {
        return "Product{" +
                "productName='" + productName + ''' +
                ", companyName='" + companyName + ''' +
                ", user='" + user + ''' +
                ", note='" + note + ''' +
                '}';
    }
}

抽象构建者类

package com.elaine.testpattern.builder;

/**
 * 抽象构建者类
 *
 * @author elaine
 * @date 2020/7/28
 */
public abstract class ProductBuilder {
    /**
     * 设置用户群体方法
     */
    public abstract void setUser();

    /**
     * 设置备注信息
     */
    public abstract void setNote();

    /**
     * 获取产品对象方法
     *
     * @return Product
     */
    public abstract Product getProduct();
}

实体类

A产品

package com.elaine.testpattern.builder;

/**
 * A产品构建类
 * 
 * @author elaine
 * @date 2020/7/28
 */
public class AProductBuilder extends ProductBuilder {
    private final Product product;

    public AProductBuilder(String productName, String companyName) {
        this.product = new Product(productName, companyName);
    }

    @Override
    public void setUser() {
        product.setUser("A user");
    }

    @Override
    public void setNote() {
        product.setNote("A note");
    }

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

B产品

package com.elaine.testpattern.builder;

/**
 * B产品构建类
 *
 * @author elaine
 * @date 2020/7/28
 */
public class BProductBuilder extends ProductBuilder {
    private final Product product;

    public BProductBuilder(String productName, String companyName) {
        this.product = new Product(productName, companyName);
    }

    @Override
    public void setUser() {
        product.setUser("B user");
    }

    @Override
    public void setNote() {
        product.setNote("B note");
    }

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

产品指导类

package com.elaine.testpattern.builder;

/**
 * 产品指导者类
 *
 * @author elaine
 * @date 2020/7/28
 */
public class ProductDirector {
    public void makeProduct(ProductBuilder productBuilder) {
        productBuilder.setUser();
        productBuilder.setNote();
    }
}

使用方法

AProductBuilder aProductBuilder = new AProductBuilder("产品A名称""产品A公司名");
productDirector.makeProduct(aProductBuilder);
Product aProduct = aProductBuilder.getProduct();
aProduct.setNote("产品A备注内容重写");
Log.e("aProduct==", aProduct.toString());

BProductBuilder bProductBuilder = new BProductBuilder("产品B名称", "产品B公司名");
productDirector.makeProduct(bProductBuilder);
Product bProduct = bProductBuilder.getProduct();
bProduct.setUser("产品B用户群体内容重写");
Log.e("bProduct==", bProduct.toString());

运行结果

图片

若帅哥美女对该系列文章感兴趣,可微信搜索公众号(木子闲集)关注更多更新文章哦,谢谢~