设计模式-建造者模式

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

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

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 分钟前
列表、数组排序总结:Collections.sort()、list.sort()、list.stream().sorted()、Arrays.sort()
java·集合·数组·排序
丶白泽22 分钟前
重修设计模式-结构型-组合模式
设计模式·组合模式
苹果酱056723 分钟前
一文读懂SpringCLoud
java·开发语言·spring boot·后端·中间件
掐指一算乀缺钱44 分钟前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑1 小时前
苍穹外卖学习笔记(七)
java·windows·笔记·学习·mybatis
就这个java爽!1 小时前
JAVA网络编程【基于TCP和UDP协议】超详细!!!
java·开发语言·网络·tcp/ip·udp·eclipse·idea
一叶飘零_sweeeet1 小时前
为什么 Feign 要用 HTTP 而不是 RPC?
java·网络协议·http·spring cloud·rpc·feign
懒洋洋大魔王1 小时前
7.Java高级编程 多线程
java·开发语言·jvm
茶馆大橘1 小时前
【黑马点评】已解决java.lang.NullPointerException异常
java·开发语言
星辰@Sea1 小时前
服务注册中心对比及使用场景分析
java·云原生