设计模式-建造者模式

建造者模式是一种创建型模式

建造者模式,其实主要的作用是将复杂对象的创建分为多个简单单一对象的组合

java 复制代码
public interface Item {
    public String name();
    public Packing packing();
    public float price();
}

这是一个商品的基类,所有的商品都为此类扩展

java 复制代码
public abstract class Burger implements Item {

    @Override
    public Packing packing() {
        return new Wrapper();
    }

    @Override
    public abstract float price();
}
java 复制代码
public class ChickenBurger extends Burger {

    @Override
    public float price() {
        return 50.5f;
    }

    @Override
    public String name() {
        return "鸡包";
    }
}

这是一个详细商品的信息,由价格名称和打包方式构成,如果需要添加新的该类型商品,只需要继承基类,有好的扩展性,符合开闭原则。

java 复制代码
public class Meal {
    private List<Item> items = new ArrayList<Item>();
    public void addItem(Item item) {
        items.add(item);
    }
    public float getCost() {
        float cost = 0.0f;
        for (Item item : items) {
            cost += item.price();
        }
        return cost;
    }
    public void showItems() {
        for (Item item : items) {
            System.out.print("商品有 : " + item.name());
            System.out.print(", 使用包装 : " + item.packing().pack());
            System.out.println(", 价格 : " + item.price());
        }
    }
}

这是一个最终产品的类(Product)对象(套餐),他由多个简单的商品类构成,还有一些简单的处理。

java 复制代码
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;
    }
}

指挥者类(Director)主要负责创建不同的复杂对象,不同的商品类都继承了基类,所以meal对象可以把不同的商品对象装入统一的列表中

java 复制代码
public class BuilderPatternDemo {
    public static void main(String[] args) {
        MealBuilder mealBuilder = new MealBuilder();

        Meal vegMeal = mealBuilder.prepareVegMeal();
        System.out.println("蔬菜套餐");
        vegMeal.showItems();
        System.out.println("总计: " +vegMeal.getCost());

        Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
        System.out.println("\n\n鸡肉套餐");
        nonVegMeal.showItems();
        System.out.println("总计: " +nonVegMeal.getCost());
    }
}

最后在调用的时候,只需要创建MealBuilder 就可以调用不同的套餐对象

如果需要新增新的套餐,只需要在指挥者类中添加新的方法调用不同接口就可以实现类型扩展。

git地址:

Design_pattern: 设计模式https://gitee.com/qiminghaonan123/design_pattern.git

相关推荐
公贵买其鹿3 分钟前
List深拷贝后,数据还是被串改
java
思忖小下9 分钟前
梳理你的思路(从OOP到架构设计)_设计模式Template Method模式
设计模式·模板方法模式·eit
xlsw_3 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹4 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭4 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫5 小时前
泛型(2)
java
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
南宫生5 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石5 小时前
12/21java基础
java
李小白665 小时前
Spring MVC(上)
java·spring·mvc