设计模式-建造者模式

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

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

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

相关推荐
庞轩px6 小时前
第七篇:Spring扩展点——如何优雅地介入Bean的创建流程
java·后端·spring·bean·aware·扩展点
tongluowan0077 小时前
一个请求在Spring MVC 中是怎么流转的
java·spring·mvc
夜郎king8 小时前
Spring AI 对接大模型开发易错点总结与实战解决办法
java·人工智能·spring
oradh8 小时前
Oracle数据库中的Java概述
java·数据库·oracle·sql基础·oracle数据库java概述
组合缺一8 小时前
Java AI 框架三国杀:Solon AI vs Spring AI vs LangChain4j 深度对比
java·人工智能·spring·ai·langchain·llm·solon
c++之路9 小时前
适配器模式(Adapter Pattern)
java·算法·适配器模式
吴声子夜歌9 小时前
Java——接口的细节
java·开发语言·算法
阿拉金alakin9 小时前
深入理解 Java 锁机制:CAS 原理、synchronized 优化与主流锁策略全总结
java·开发语言
myheartgo-on9 小时前
Java—方 法
java·开发语言·算法·青少年编程
雨落在了我的手上9 小时前
如何学习java?
java·开发语言·学习