设计模式(5、建造者模式)

建造者模式(生成器模式):用于产品和产品建造过程解耦;

方式一、4个角色:
    1、产品-具体对象
    2、抽象建造者-定义建造者公共方法
    3、具体建造者-具体的建造实现
        一个产品属性、多个建造方法、一个返回产品方法;
        产品作为属性,构造方法传进去,多个建造方法修改产品,一个get产品方法返回最终建造成的产品
    4、指挥者-调用建造者方法构造具体的产品
        一个创建产品对象的方法,传入抽象构造者,构造者调用多个建造方法,最后调用建造者的返回产品方法得到产品
    使用:建指挥者对象,调用创建产品对象的方法,返回由指挥者调用建造者建造的具体对象;
方式二、3个角色:
    1、产品-具体对象
    2、抽象建造者-定义建造者公共方法
    3、具体建造者-具体的建造实现
        一个产品属性、多个建造方法(每个方法都返回this)、一个返回产品方法
        产品作为属性,构造方法传进去,多个建造方法修改产品然后返回this,方便链式调用,一个get产品方法返回最终建造成的产品;
    使用:new一个建造者,链式调用建造方法,最后调用建造者的返回产品方法得到产品;
区别:方式二省了指挥者,更加灵活,更符合定义。可以根据用户需求自由定义更改内容,并且无需改变具体的构造方式。就可以生产出不同复杂产品;

本文demo编码实现<方式二、3个角色>这种建造者模式。

故事背景:

 深圳科技园,某日晚10点,程序员小李刚发完版下班,肚饿饿了,心想这次发版还好,遇到的问题也都解决了,拿出手机准备看看附件哪里有好吃的,一眼看到房东的信息,"你好,x月房租2xxx,请于xx号之前...",小李看了看自己卡里的余额...,来深一年多,知道公司背后一家炒河粉店还不错,就去那里吧;
来到路边炒粉摊,摊子正上方"正宗潮汕牛肉粉面"格外明显,来过很多次,这次发版还算顺利,小李对摊主说"靓仔,来份炒河粉,加牛肉、火腿肠、鸡蛋、豆芽、白菜,加辣"...

UML类图:

代码实现:

import lombok.Data;

/**
 * 建造者模式
 */

//具体产品-炒粉
//这里偷个懒和代码整洁,用了下lombok
@Data
class Product {
    private String buildA;  //河粉
    private String buildB;  //细粉
    private String buildC;  //细面
    private String buildD;  //牛肉
    private String buildE;  //火腿肠
    private String buildF;  //鸡蛋
    private String buildG;  //豆芽
    private String buildH;  //白菜
}

//抽象建造者
abstract class Builder {
    //炒河粉
    abstract Builder bulidA(String mes);

    //炒细粉
    abstract Builder bulidB(String mes);

    //炒细面
    abstract Builder bulidC(String mes);

    //加牛肉
    abstract Builder bulidD(String mes);

    //加火腿肠
    abstract Builder bulidE(String mes);

    //加鸡蛋
    abstract Builder bulidF(String mes);

    //加豆芽
    abstract Builder bulidG(String mes);

    //加白菜
    abstract Builder bulidH(String mes);

    //获取炒粉
    abstract Product build();
}

//具体建造者-炒粉小哥靓仔
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;
    }

    @Override
    Builder bulidE(String mes) {
        product.setBuildE(mes);
        return this;
    }

    @Override
    Builder bulidF(String mes) {
        product.setBuildF(mes);
        return this;
    }

    @Override
    Builder bulidG(String mes) {
        product.setBuildG(mes);
        return this;
    }

    @Override
    Builder bulidH(String mes) {
        product.setBuildH(mes);
        return this;
    }
}

public class BuilderMode {
    public static void main(String[] args) {
        //具体建造者-炒粉小哥
        Builder builder1 = new ConcreteBuilder();
        //炒粉-高配版
        Product productHigh = builder1.bulidA("河粉")
                .bulidD("牛肉")
                .bulidE("火腿肠")
                .bulidF("鸡蛋")
                .bulidG("豆芽")
                .bulidH("白菜").build();
        System.out.println("高配版炒河粉: ");
        System.out.println(productHigh);
        
        //具体建造者-炒粉小哥
        Builder builder2 = new ConcreteBuilder();
        //炒粉-低配版
        Product productLow = builder2.bulidA("河粉")
                .bulidF("鸡蛋")
                .bulidG("豆芽").build();
        System.out.println("低配版炒河粉: ");
        System.out.println(productLow);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小绿豆

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值