实战java设计模式(六)建造者模式

1 介绍

使用多个简单的对象一步一步构建成一个复杂的对象。实现对象设计和创建解耦。

2 例子

假设要不同厂商生产不同牌子的自行车。

2.1 自行车类

//自行车类
class Bicycle {
    private String type;//自行车的类型:电动的、非电动的
    private String color;//颜色
    private boolean light;//是否带电灯
    //设置这些属性
    public void setColor(String color) {
        this.color = color;
    }
    public void setLight(boolean light) {
        this.light = light;
    }
    public void setType(String type) {
        this.type = type;
    }
    //变成字符串
    public String toString(){
        return "type:"+this.type+" color:"+this.color+" light:"+this.light;
    }
}

2.2 抽象建造者

//抽象建造者
interface Builder{
   void setColor();
   void setLight();
   void setType();
   Bicycle getBicycle();
}

2.3 具体生产商

//泰山牌
class TaishanBicycle implements Builder{
    //创建一个实例
    Bicycle bicycle=new Bicycle();

    @Override
    public void setColor() {
        bicycle.setColor("白色");
    }

    @Override
    public void setLight() {
        bicycle.setLight(true);
    }

    @Override
    public void setType() {
        bicycle.setType("电动车");
    }

    @Override
    public Bicycle getBicycle() {
        return this.bicycle;
    }
}
//小鹿牌自行车
class Xiaolu implements Builder{
    //创建一个实例
    Bicycle bicycle=new Bicycle();

    @Override
    public void setColor() {
        this.bicycle.setColor("黑色");
    }

    @Override
    public void setLight() {
        this.bicycle.setLight(false);
    }

    @Override
    public void setType() {
        this.bicycle.setType("非电动");
    }

    @Override
    public Bicycle getBicycle() {
        return this.bicycle;
    }
}

2.4 指挥生产者

//指挥者
class Director {
    public void build(Builder builder) {
        builder.setColor();
        builder.setLight();
        builder.setType();
    }
}

2.5 测试主类

public class Main {
    public static void main(String[] args) {
        Director director=new Director();
        TaishanBicycle taishanBicycle=new TaishanBicycle();
        director.build(taishanBicycle);
        Bicycle bicycle=taishanBicycle.getBicycle();
        //使用
        System.out.println(bicycle.toString());
    }

}

3 例子升华

其实上面那个例子不太好,但是经过这个例子,也有一些新的感悟。
最恰当的例子,甲方乙方合作生产一个产品更加适合。

4 总结

4.1 核心角色

  • 产品类:这是一个实体类,包含了属性和方法(getter和setter),最重要的是setter。可以把这个想象成甲方想要做一个产品,他不知道怎么才是最精简的方式,于是把所有的属性和方法都全部加入进去图纸准备好。
  • 抽象建造者:这里面包含两个东西,就是构建这个产品的方法,不必知道怎么做的,只有个甲方模糊认识即可,比如把大象装进冰箱要几步?以及一个产品对象。
  • 具体建造者:实现抽象建造者,乙方们实现了甲方的方法,去生产这个产品,各个乙方的想法都不一样,操作也不一样,所以生产出来的产品也不太一样。
  • 指挥者:执行所有抽象方法。甲方拿到了乙方的解决方案,按照我的计划(抽象建造者)全部执行一遍。

4.2 核心代码结构

产品类是实体类完善的且不变的。不同的建筑者去执行不同的建造方案。
缺点:产品类要定义好,否则只要一变化,建造者们都要变!!!

5 与工厂模式的不同

工厂模式的重点在于生产模式,怎么去产生对象比较好,而不太关心这个对象本身情况。
建造者模式重点在于产品本身,需要创建什么样的对象。
例如:工厂模式在乎的是人员去哪儿,而建造者模式在乎人长什么样子。二者可以一起用,并不矛盾。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值