建造者模式案例

356 阅读3分钟

[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来进行运行 ,(就是我们的ClientBuilderPatternDemo类

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