设计模式之建造者模式

建造者模式


/**
 * 创建一个水果套餐Meal类
 */
public class FruitMeal {
    private Apple apple;//苹果--价格
    private Banana banana;//香蕉价格
    private Orange orange;    //桔子价格
    private int discount;//折扣价

    private int totalPrice;//套餐总价

    public void setDiscount(int discount) {
        this.discount = discount;
    }

    public void setApple(Apple apple) {
        this.apple = apple;
    }

    public void setBanana(Banana banana) {
        this.banana = banana;
    }

    public void setOrange(Orange orange) {
        this.orange = orange;
    }

    public int cost() {
        return this.totalPrice;
    }

    public void init() {
        if (null != apple) {
            totalPrice += apple.price();
        }
        if (null != orange) {
            totalPrice += orange.price();
        }
        if (null != banana) {
            totalPrice += banana.price();
        }
        if (totalPrice > 0) {
            totalPrice -= discount;
        }
    }

    public void showItems() {
        System.out.println("totalPrice:" + totalPrice);
    }
}

/**
 * 创建一个MealBuilder类,实际的builder类负责创建套餐Meal对象。
 */
public interface Builder { // 也是工厂
    void buildApple(int price); // 设置苹果

    void buildBanana(int price); // 设置香蕉

    void buildOrange(int price); // 设置桔子

    FruitMeal getFruitMeal(); // 返回创建的套餐
}


import com.enjoy.entity.fruit.Apple;
import com.enjoy.entity.fruit.Banana;
import com.enjoy.entity.fruit.Orange;

/**
 * 假期-建造策略实现类
 */
public class HolidayBuilder implements Builder {
    private FruitMeal fruitMeal = new FruitMeal();

    @Override
    public void buildApple(int price) {
        Apple apple = new Apple();
        apple.setPrice(price);
        fruitMeal.setApple(apple);
    }

    @Override
    public void buildBanana(int price) {
        Banana fruit = new Banana();
        fruit.setPrice(price);
        fruitMeal.setBanana(fruit);
    }

    @Override
    public void buildOrange(int price) {
        Orange fruit = new Orange("Peter", 80);
        fruit.setPrice(price);
        fruitMeal.setOrange(fruit);
    }

    @Override
    public FruitMeal getFruitMeal() {
        fruitMeal.setDiscount(15);// 折扣价格对一个套餐来,是固定的
        fruitMeal.init();
        return fruitMeal;
    }
}


import com.enjoy.entity.fruit.Apple;
import com.enjoy.entity.fruit.Banana;
import com.enjoy.entity.fruit.Orange;

/**
 * 老用户-建造策略实现类
 */
public class OldCustomerBuilder implements Builder {
    private FruitMeal fruitMeal = new FruitMeal();

    @Override
    public void buildApple(int price) {
        Apple apple = new Apple();
        apple.setPrice(price);
        fruitMeal.setApple(apple);
    }

    @Override
    public void buildBanana(int price) {
        Banana fruit = new Banana();
        fruit.setPrice(price);
        fruitMeal.setBanana(fruit);
    }

    @Override
    public void buildOrange(int price) {
        Orange fruit = new Orange("Peter", 80);
        fruit.setPrice(price);
        fruitMeal.setOrange(fruit);
    }

    @Override
    public FruitMeal getFruitMeal() {
        fruitMeal.setDiscount(10);
        fruitMeal.init();
        return fruitMeal;
    }
}

/**
 * 监工类
 */
public class FruitMealDirector {//收银台---监工类
    public void constructOldCustomer() {
        Builder builder = new OldCustomerBuilder();// spring注入方法,

        // 以下代码模板,轻易是不变的
        builder.buildApple(120);// 创建苹果设置价格
        builder.buildBanana(80);// 创建香蕉设置香蕉价格
        builder.buildOrange(50);// 创建桔子设置价格

        FruitMeal fruitMeal = builder.getFruitMeal();

        int cost = fruitMeal.cost();
        System.out.println("本套件花费:" + cost);
    }

    public void constructHoliday() {
        Builder builder = new HolidayBuilder(); // spring注入方法,

        // 以下代码模板,轻易是不变的
        builder.buildApple(120);// 创建苹果设置价格
        builder.buildBanana(80);// 创建香蕉设置香蕉价格
        builder.buildOrange(50);// 创建桔子设置价格

        FruitMeal fruitMeal = builder.getFruitMeal();

        int cost = fruitMeal.cost();
        System.out.println("本套件花费:" + cost);
    }

    public static void main(String[] args) {
        new FruitMealDirector().constructOldCustomer();
        new FruitMealDirector().constructHoliday();
    }
}


https://www.nowcoder.com/discuss/331574?type=2

https://www.nowcoder.com/discuss/347653?type=7

https://www.nowcoder.com/discuss/345547?type=7

https://www.nowcoder.com/discuss/347346?type=0&order=0&pos=14&page=1

https://www.nowcoder.com/discuss/347616?type=1
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小 明

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

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

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

打赏作者

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

抵扣说明:

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

余额充值