创建型设计模式建造者模式

Posted riches

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建型设计模式建造者模式相关的知识,希望对你有一定的参考价值。

一、一句话背景

假如我去麦当劳,麦当劳提供了多种多样的套餐供我选择,但是套餐组成无非就是汉堡、鸡翅、冷饮、薯条等这几种固定的东西,搭配不同就变成了不同的套餐,那么菜单的生成就可以使用建造者模式来进行

二、使用场景

基础组件不变,组合逻辑多变的场景。

如:套餐搭配

三、模型分析

菜单:类,把不同的对象组装起来,形成不同的套餐,应对不同的客户需求(套餐列表)

套餐属性:接口,定义套餐具体特征(套餐名字,包装方式,价格等)

套餐组成:抽象类,实现了套餐公有的属性方法(汉堡、饮料等广泛的内容)

套餐具体内容:类,具体的套餐组成(鸡腿汉堡,可乐等具体的内容)

包装:接口(定义包装的方法)

包装类型:类,实现包装接口(具体的包装方式)

四、代码分析

套餐属性

/**
 * 套餐属性接口
 */
public interface Item 
    public String name();

    public Packing packing();

    public float price();

包装

/**
 * 包装接口,定义了包装产品的方法
 */
public interface Packing 
    public String pack();

套餐组成

/**
 * 汉堡抽象类(继承了公有的方法)
 */
public abstract class Burger implements Item 

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

    @Override
    public abstract float price();
/**
 * 冷饮抽象类(继承了公有的方法)
 */
public abstract class ColdDrink implements Item 

    @Override
    public Packing packing() 
        return new Bottle();
    

    @Override
    public abstract float price();

套餐具体内容

/**
 * 鸡肉汉堡类,汉堡类的具体实现
 */
public class ChickenBurger extends Burger 

    @Override
    public float price() 
        return 50.5f;
    

    @Override
    public String name() 
        return "Chicken Burger";
    
/**
 * 素汉堡类,汉堡类的具体实现
 */
public class VegBurger extends Burger 

    @Override
    public float price() 
        return 25.0f;
    

    @Override
    public String name() 
        return "Veg Burger";
    
/**
 * 可口可乐类,冷饮类的具体实现
 */
public class Coke extends ColdDrink 

    @Override
    public float price() 
        return 30.0f;
    

    @Override
    public String name() 
        return "Coke";
    
/**
 * 百事可乐类,冷饮类的具体实现
 */
public class Pepsi extends ColdDrink 

    @Override
    public float price() 
        return 35.0f;
    

    @Override
    public String name() 
        return "Pepsi";
    

包装类型

/**
 * 瓶子包装
 */
public class Bottle implements Packing 
    @Override
    public String pack() 
        return "Bottle";
    
/**
 * 纸盒包装
 */
public class Wrapper implements Packing 
    @Override
    public String pack() 
        return "Wrapper";
    

套餐

/**
 * 套餐类
 */
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 : " + item.name());
            System.out.print(", Packing : " + item.packing().pack());
            System.out.println(", Price : " + item.price());
        
    

套餐生成器(菜单)

/**
 * 套餐生成类(菜单)
 */
public class MealBuilder 

    /**
     * 素食套餐
     *
     * @return
     */
    public Meal prepareVegMeal() 
        Meal meal = new Meal();
        meal.addItem(new VegBurger());
        meal.addItem(new Coke());
        return meal;
    

    /**
     * 肉食套餐
     *
     * @return
     */
    public Meal prepareNonVegMeal() 
        Meal meal = new Meal();
        meal.addItem(new ChickenBurger());
        meal.addItem(new Pepsi());
        return meal;
    

 

 

以上是关于创建型设计模式建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

创建型模式:建造者模式

创建型模式:建造者模式

创建型模式(建造者模式)

创建型模式之建造者模式

创建型模式—建造者模式

(创建型模式)建造者模式