设计模式——建造者模式

一、应用场景

1,初始化一个对象非常复杂,参数多,很多参数都有默认值;

2,多个部件或零件,都可以装配到一个对象中,但是产生的结果又不同;

3,对象属性之间存在依赖关系,如果使用set方式会导致这种关系和校验得不到验证。比如规定长方形面积不能超过20,如果长设定为5的情况下,那么在设定宽的时候,就会校验其不能大于4;

二、建造者模式

2.1 模式说明

将一个复杂对象的构建与它的表示分离,使得同样的构建过程,不同的构建顺序可以创建不同的表示。

图 建造者模式

2.2 代码实现 

public class Goods {

    /**
     * 商品类别 0 普通商品 1 虚拟商品
     */
    private int type;

    /**
     * 名称
     */
    private String name;

    /**
     * 重量
     */
    private double weight;

    /**
     * 网址
     */
    private String url;

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "type=" + type +
                ", name='" + name + '\'' +
                ", weight=" + weight +
                ", url='" + url + '\'' +
                '}';
    }
}
public abstract class Builder {

    private Goods goods = new Goods();

    public abstract void buildName(String name);

    public abstract void buildWeight(double weight);

    public abstract void buildUrl(String url);

    public Goods getGoods() {
        return goods;
    }

}
public class OrdinaryBuilder extends Builder {

    @Override
    public void buildName(String name) {
        this.getGoods().setName(name);
    }

    @Override
    public void buildWeight(double weight) {
        this.getGoods().setType(0);
        this.getGoods().setWeight(weight);
    }

    @Override
    public void buildUrl(String url) {

    }
}
public class VirtualBuilder extends Builder{

    @Override
    public void buildName(String name) {
        this.getGoods().setName(name);
    }

    @Override
    public void buildWeight(double weight) {
    }

    @Override
    public void buildUrl(String url) {
        this.getGoods().setType(1);
        this.getGoods().setUrl(url);
    }

}
public class Shop {

    public static void main(String[] args) {
        Builder ordinaryBuilder = new OrdinaryBuilder();
        Builder virtualBuilder = new VirtualBuilder();

        //创建一般商品
        ordinaryBuilder.buildName("大西瓜");
        ordinaryBuilder.buildWeight(300);
        System.out.println(ordinaryBuilder.getGoods());

        //创建虚拟商品
        virtualBuilder.buildName("你懂得的网站");
        virtualBuilder.buildUrl("https://baidu.com");
        System.out.println(virtualBuilder.getGoods());

    }

}

2.3 优缺点

优点:1)扩展性好,各个具体的建造者相互独立,有利于系统的解耦;2)建造者可以对创建过程逐步细化,而不对其他模块产生任何影响;3)客户端可不必知道产品内部的组成细节

缺点:1)要求创建的产品具有较多的共同点、组成部分相似;2)如果产品内部变化复杂,可能需要定义很多具体建造者类来实现这种变化,会使系统变得很庞大;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值