设计模式-建造者模式

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

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

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 分钟前
用 SpringAIAlibab 让高频问题实现毫秒级响应
java·人工智能·spring
anzhxu4 分钟前
SpringBoot 3.x 整合swagger
java·spring boot·后端
gechunlian884 分钟前
Spring Security 官网文档学习
java·学习·spring
小江的记录本7 分钟前
【Bean】JavaBean(原生规范)/ Spring Bean 【重点】/ 企业级Bean(EJB/Jakarta Bean)
java·数据库·spring boot·后端·spring·spring cloud·mybatis
qqty12177 分钟前
spring loC&DI 详解
java·spring·rpc
中国胖子风清扬11 分钟前
Camunda 8 概念详解:梳理新一代工作流引擎的核心概念与组件
java·spring boot·后端·spring cloud·ai·云原生·spring webflux
闻哥13 分钟前
MySQL InnoDB 缓存池(Buffer Pool)详解:原理、结构与链表管理
java·数据结构·数据库·mysql·链表·缓存·面试
殷紫川15 分钟前
告别臃肿部署!Java Serverless 函数计算架构全解与实战选型指南
java·架构
孟陬28 分钟前
为什么国外技术大神都爱自己搭博客,而国内程序员却挤在微信公众号或掘金?
java·typescript·前端框架
GawynKing32 分钟前
Java文件传输利器:MultipartFile介绍
java·开发语言