设计模式总结(7)

设计模式总结(7)

建造者模式

建造者模式用于解决在细节上经常变化,但是组合上却相对稳定的场景。比如我们去快餐店点餐,可能有时候点的是素食汉堡,有时候点的是鸡肉汉堡,但不管点的是哪种汉堡,它们都是装在纸盒中的;同理,有时候喝的的百事可乐,有时候喝的是可口可乐,它们都是状态瓶子中的。虽然点的餐不同,但是组合是大致不变的,变的只是价格和食材。
优点: 建造者独立易拓展,便于控制细节
缺点: 产品具有共同点,范围限制;内部变化复杂,有很多的建造类


定义一个表示食物名称和价格的接口:

public interface Item {
    /**
     * 食材名称
     * @return
     */
    String name();

    /**
     * 包装
     * @return
     */
    Packing packing();

    /**
     * 价格
     * @return
     */
    float price();
}

定义一个包装接口:

public interface Packing {
    /**
     * 表示包装
     * @return
     */
    String pack();
}

定义实现包装接口的纸盒类和瓶子类:

public class Bottle implements Packing {
    /**
     * 表示包装
     * 包装为瓶子
     *
     * @return
     */
    @Override
    public String pack() {
        return "Bottle";
    }
}
public class Wrapper implements Packing {
    /**
     * 表示包装
     * 包装为纸盒
     *
     * @return
     */
    @Override
    public String pack() {
        return "Wrapper";
    }
}

定义实现Item的抽象类,比如汉堡和冷饮:

public abstract class Burger implements Item{


    /**
     * 包装
     * 汉堡的包装为纸盒
     * @return
     */
    @Override
    public Packing packing() {
        return new Wrapper();
    }

    /**
     * 价格
     *
     * @return
     */
    @Override
    public abstract float price();
}
public abstract class ColdDrink implements Item {
    /**
     * 包装
     * 冷饮包装为瓶子
     * @return
     */
    @Override
    public Packing packing() {
        return new Bottle();
    }

    /**
     * 价格
     *
     * @return
     */
    @Override
    public abstract float price();
}

实现具体的不同种类的汉堡和可乐:

/**
 * 素食汉堡
 */
public class VegBurger extends Burger {
    /**
     * 价格
     *
     * @return
     */
    @Override
    public float price() {
        return 25.0f;
    }

    /**
     * 食材名称
     *
     * @return
     */
    @Override
    public String name() {
        return "Veg Burger";
    }
}

/**
 * 鸡肉汉堡
 */
public class ChickenBurger extends Burger{
    /**
     * 价格
     *
     * @return
     */
    @Override
    public float price() {
        return 50.5f;
    }

    /**
     * 食材名称
     *
     * @return
     */
    @Override
    public String name() {
        return "Chicken Burger";
    }
}

/**
 * 百事可乐
 */
public class Pepsi extends ColdDrink {
    /**
     * 价格
     *
     * @return
     */
    @Override
    public float price() {
        return 35.0f;
    }

    /**
     * 食材名称
     *
     * @return
     */
    @Override
    public String name() {
        return "Pepsi";
    }
}

/**
 * 可口可乐
 */
public class Coke extends ColdDrink {
    /**
     * 价格
     *
     * @return
     */
    @Override
    public float price() {
        return 30.0f;
    }

    /**
     * 食材名称
     *
     * @return
     */
    @Override
    public String name() {
        return "Coke";
    }
}

创建一个Meal类,负责组装食材、定义价格:

/**
 * 具体创建不同组合的食物
 */
public class MealBuilder {
    public Meal prepareVegMeal() {
        Meal meal = new Meal();
        meal.addItem(new VegBurger());
        meal.addItem(new Coke());
        return meal;
    }

    public Meal prepareNonVegMeal() {
        Meal meal = new Meal();
        meal.addItem(new ChickenBurger());
        meal.addItem(new Pepsi());
        return meal;
    }
}

测试:

public class BuiderPatternDemo {
    public static void main(String[] args) {
        MealBuilder mealBuilder = new MealBuilder();

        Meal vegMeal = mealBuilder.prepareVegMeal();
        System.out.println("Veg Meal");
        vegMeal.showItem();
        System.out.println("Total Cost: " +vegMeal.getCost());

        Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
        System.out.println("Non-Veg Meal");
        nonVegMeal.showItem();
        System.out.println("Total Cost: " +nonVegMeal.getCost());

    }
}

结果:

Veg Meal
Total Cost: 55.0
Non-Veg Meal
Total Cost: 85.5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值