为了账号安全,请及时绑定邮箱和手机立即绑定

建造者模式案例

[TOC]

建造者解析》

例子

我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮

(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger)

,它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是

装在瓶子中。
我们将创建一个表示食物条目(比如汉堡和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个

表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中

。
然后我们创建一个 Meal 类,带有 Item 的 ArrayList 和一个通过结合 Item 来创建不同类型的 Meal 

对象的 MealBuilder。BuilderPatternDemo,我们的演示类使用 MealBuilder 来创建一个 Meal。

分析

分析:
    分为两种 ,一种是汉堡 、一种是冷饮 
    汉堡又分为 : 素食汉堡  、 鸡肉汉堡  这些都包装在盒子中
    冷饮又分为: 可口可乐  、 百事可乐  这些放在瓶子中

步骤

1、创建 :食物条目类Item{名称 、 包装 、 价格 、}和食物包装pack的接口;

Item

package Builder;

/**
 * 食物条目
 * @author Administrator
 *
 */
public interface Iteam {

    /**
     * 名称
     * @return
     */
    public String name();

    /**
     * 包裹
     * @return
     */
    public  Packing packing();

    /**
     * 价格
     * @return
     */
    public float price();

}

Packing

package Builder;

public interface Packing {

    /**
     * 
     * @return
     */
    public  String pack();
}

2、实现包装pack接口的两个类: 盒子Wrapper 、瓶子Bottle

Wrapper

package Builder;

public class Wrapper  implements Packing{

    @Override
    public String pack() {

        return "Wrapper";
    }

}

Bottle

package Builder;

public class Bottle implements Packing{

    @Override
    public String pack() {
        return "Bottle";
    }

}

3、实现 食物条目Item接口的类: 汉堡Burger、 冷饮ColdDrink

Burger

package Builder;

public abstract class Burger implements Iteam{

    @Override
    public Packing packing() {
        // TODO Auto-generated method stub
        return new Wrapper();
    }

    @Override
    public abstract float price();

}

ColdDrink

package Builder;

public abstract class ColdDrink implements Iteam{

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

    @Override
    public abstract float price();
}

4、创建 汉堡 和 冷饮 的具体类 : 素食汉堡 VegBurger 、 鸡肉汉堡ChickenBurger、可
口可乐coke、百事可乐Pepsi

VegBurger类

package Builder;

public class VegBurger extends Burger{

    @Override
    public String name() {
        // TODO Auto-generated method stub
        return "Veg Burger";
    }

    @Override
    public float price() {
        // TODO Auto-generated method stub
        return 25.0f;
    }

}

ChickenBurger类

package Builder;

public class ChickenBurger extends Burger{

    @Override
    public String name() {
        // TODO Auto-generated method stub
        return "Chicken Burger";
    }

    @Override
    public float price() {
        // TODO Auto-generated method stub
        return 45.0f;
    }

}

Pepsi类

package Builder;

public class Pepsi extends ColdDrink{

    @Override
    public String name() {
        // TODO Auto-generated method stub
        return "Pepsi";
    }

    @Override
    public float price() {
        // TODO Auto-generated method stub
        return 35.0f;
    }

}

coke类

package Builder;

public class Coke extends ColdDrink{

    @Override
    public String name() {
        // TODO Auto-generated method stub
        return "Coke";
    }

    @Override
    public float price() {
        // TODO Auto-generated method stub
        return 30.0f;
    }

}

5、创建 Meal 类 、对Item中的类型 进行价格和显示的类;
Meal类

package Builder;

import java.util.ArrayList;
import java.util.List;

public class Meal {

    private List<Iteam> iteams = new ArrayList<Iteam>();

    public void addMeal(Iteam iteam) {
        iteams.add(iteam);
    }

    public float getCost() {
        float cost = 0.0f;
        for (Iteam iteam : iteams) {
            cost += iteam.price();
        }
        return cost;
    }

    public void showItem() {
        for (Iteam iteam : iteams) {
            System.out.print("Item : " + iteam.name());
            System.out.print(", Packing : " + iteam.packing().pack());
            System.out.println(", Price : " + iteam.price());

        }
    }

}

6、BuilderMeal类 实际的Builder 类 ,负责创建Meal 对象;
BuilderMeal类

package Builder;

public class MealBuilder {

    public Meal prepareVegMeal() {
        Meal meal = new Meal();
        meal.addMeal(new VegBurger());
        meal.addMeal(new Coke());
        return meal;
    }

    public Meal prepareNonVegMeal() {
        Meal meal = new Meal();
        meal.addMeal(new ChickenBurger());
        meal.addMeal(new Pepsi());
        return meal;
    }
}

7、BuilderPatternDemo ,使用MealBuilder来进行运行 ,(就是我们的Client
BuilderPatternDemo类

package Builder;

public class BuilderPatternDemo {

    public static void main(String[] args) {
        MealBuilder mealBuilder = new MealBuilder();

        Meal vegMeal = mealBuilder.prepareVegMeal();
        System.out.println("Veg Meal");
        vegMeal.showItem();
        System.out.println("Total cost"+vegMeal.getCost());

        Meal nonvegMeal = mealBuilder.prepareNonVegMeal();
        System.out.println("Veg Meal");
        nonvegMeal.showItem();
        System.out.println("Total cost"+nonvegMeal.getCost());
    }
}

结果

Veg Meal
Item : Veg Burger, Packing : Wrapper, Price : 25.0
Item : Coke, Packing : Bottle, Price : 30.0
Total cost55.0
Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 45.0
Item : Pepsi, Packing : Bottle, Price : 35.0
Total cost80.0
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
移动开发工程师
手记
粉丝
7
获赞与收藏
35

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消