设计模式之建造者模式

什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就建造者模式简要概述。

什么是建造者模式
建造者模式就是将多个简单的对象一步步构建为复杂大对象,这种模式也是创建型模式,是创建对象的最佳方式。

应用场景
建造者模式一般应用于内部结构复杂、可灵活组合多个对象产生不同结果的大对象情况。比如去商店买水果,可以选择不同的套餐,每个套餐又包含不同的水果,作为消费者只需要选择套餐即可。

小试牛刀
我们以水果店的套餐作为测试用例。
首先创建一个账单接口Accounts,内部提供商品名称和商品价格两个方法。然后我们创建苹果、梨子、香蕉三个实现账单接口。再准备一个套餐实体Meal,内部提供添加商品、获取商品列表、获取商品名和总价的方法。再者,我们再创建一个套餐生产者MealBuilder用来生产套餐Meal。最后,我们消费者只需要选择套餐即可拿到我们需要的商品组合。
在这里插入图片描述

1、账单接口Accounts

/**
 * 结账单
 * @author senfel
 * @version 1.0
 * @date 2022/8/11 11:44
 */
public interface Accounts {

    /**
     * 商品名称
     * @return
     */
    String goodsName();

    /**
     * 价格
     * @return
     */
    Double cost();
}

2、三个水果类并实现账单接口

/**
 * 苹果
 * @author senfel
 * @version 1.0
 * @date 2022/8/11 11:49
 */
public class Apple implements Accounts{
    @Override
    public String goodsName() {
        return "苹果";
    }

    @Override
    public Double cost() {
        return 10.00;
    }
}
/**
 * 香蕉
 * @author senfel
 * @version 1.0
 * @date 2022/8/11 11:51
 */
public class Banana implements Accounts{

    @Override
    public String goodsName() {
        return "香蕉";
    }

    @Override
    public Double cost() {
        return 5.60;
    }
}
/**
 * 梨子
 * @author senfel
 * @version 1.0
 * @date 2022/8/11 11:52
 */
public class Pear implements Accounts{
    @Override
    public String goodsName() {
        return "梨子";
    }

    @Override
    public Double cost() {
        return 9.52;
    }
}

3、套餐

/**
 * 套餐
 * @author senfel
 * @version 1.0
 * @date 2022/8/11 11:55
 */
@Data
public class Meal {

    private List<Accounts> accountsList = new ArrayList<>();

    /**
     * 套餐名称
     */
    private String mealName;

    public Meal(String mealName) {
        this.mealName = mealName;
    }

    /**
     * 新增商品
     */
    public void addGoods(Accounts accounts){
        accountsList.add(accounts);
    }

    /**
     * 商品列表
     */
    public void showGoods(){
        accountsList.stream().forEach(obj ->{
            System.err.println("商品:"+obj.goodsName()+" 单价:"+obj.cost());
        });
    }

    /**
     * 获取价格
     * @return
     */
    public Double getMealPrice(){
        if(accountsList.size() == 0){
            return 0.00;
        }
        AtomicReference<Double> price = new AtomicReference<>(0.00);
        accountsList.forEach(obj->{
            price.updateAndGet(v -> v + obj.cost());
        });
        return BigDecimal.valueOf(price.get()).setScale(2, RoundingMode.HALF_UP).doubleValue();
    }

}

4、用构建者来生产套餐

/**
 * 套餐建造
 * @author senfel
 * @version 1.0
 * @date 2022/8/11 13:38
 */
public class MealBuilder {

    /**
     * 套餐一
     * @return
     */
    public Meal buildMealOne(){
        Meal meal = new Meal("套餐一");
        meal.addGoods(new Apple());
        meal.addGoods(new Banana());
        return meal;
    }


    /**
     * 套餐二
     * @return
     */
    public Meal buildMealTwo(){
        Meal meal = new Meal("套餐二");
        meal.addGoods(new Apple());
        meal.addGoods(new Banana());
        meal.addGoods(new Pear());
        return meal;
    }
}

5、消费者消费套餐

/**
 * 建造者模式测试
 * @author senfel
 * @version 1.0
 * @date 2022/8/11 13:42
 */
@SpringBootTest
public class TestMealModel {

    @Test
    public void test(){
        //获取套餐一
        Meal meal = new MealBuilder().buildMealOne();
        System.err.println("套餐名称:"+meal.getMealName());
        meal.showGoods();
        System.err.println("套餐价格:"+meal.getMealPrice());

        //获取套餐二
        Meal mealTwo = new MealBuilder().buildMealTwo();
        System.err.println("套餐名称:"+mealTwo.getMealName());
        mealTwo.showGoods();
        System.err.println("套餐价格:"+mealTwo.getMealPrice());
    }
}

消费情况:
套餐名称:套餐一
商品:苹果 单价:10.0
商品:香蕉 单价:5.6
套餐价格:15.6
套餐名称:套餐二
商品:苹果 单价:10.0
商品:香蕉 单价:5.6
商品:梨子 单价:9.52
套餐价格:25.12

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小沈同学呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值