建造者模式案例

[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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 建造模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同表示。 UML图: 需求: 我们假设一...
  • 建造者模式(Builder Pattern) 使用多个简单的对象一步一步构建成一个复杂的对象。一个 Builder...
    愤怒皮卡阅读 623评论 1 2
  • 建造者模式 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的...
    卢二牛阅读 1,776评论 2 2
  • 定义 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模...
    4ea0af17fd67阅读 218评论 0 1
  • 提笔写字。 耳机播放着一首伤感的歌,略微矫情的歌词。 脑海里突然浮现出他的模样,和他一起走过那条昏黄的路。 一路无...
    嗒嗒嗒嗒嗒鱼阅读 202评论 0 0