设计模式-建造者模式

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

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

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

相关推荐
江沉晚呤时27 分钟前
使用 NServiceBus 在 .NET 中构建分布式系统
java·服务器·开发语言·mysql·.net
27669582922 小时前
美团优选小程序 mtgsig 分析 mtgsig1.2
java·python·小程序·美团·mtgsig·mtgsig1.2·美团优选
mqiqe2 小时前
java 加入本地lib jar处理方案
java·python·jar
backRoads3 小时前
ThreadLocal详解
java
纪元A梦3 小时前
华为OD机试真题——斗地主之顺子(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
java·c语言·javascript·c++·python·华为od
Mr.Demo.3 小时前
[Spring] Sentinel详解
java·spring·sentinel
钢铁男儿3 小时前
Python 使用一等函数实现设计模式(案例分析:重构“策略”模式)
python·设计模式·重构
Betty_蹄蹄boo3 小时前
怎么样才能在idea中写入spark程序
java·ide·intellij-idea
3 小时前
Unity 几种主流的热更新方式
java·unity·游戏引擎