说明
参考文献:http://www.runoob.com/design-pattern/builder-pattern.html
上边的这个菜鸟教程是真的不错,我也是借花献佛,只是自己写了一哈,加上自己的理解和代码注释来分享一下心得吧!免得以后忘了。
建造者模式的理解
建造者模式就是把基础的,可以隔离出来,具有原子性的组件或者模块隔离开来,然后组装起来实现多变化,复杂性较高的系统,就像建一栋大楼一样的,据说现在个把月就可以组件一栋高楼。
项目实例说明
简单的说就是我们要构建一个智能的点餐系统,用户输入点餐的东西,系统自动给出该套餐的信息和价格。当然,主要是学习java建造者模式,可以说完全就没有用户体验(晕)。
项目实例
我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(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。
项目模式图
项目目录
项目代码说明(实践出真知)
创建一个表示食物条目和食物包装的接口。
package BuildStudy;
public interface Item {//菜单项,包括商品name,包装方式paking和商品价格
public String name();
public Packing paking();//是一个接口,需要单独实现包装方式的实现类
public float price();
}
package BuildStudy;
public interface Packing {
public String pack();//包装接口
}
创建实现 Packing 接口的实体类。
package BuildStudy;
public class Wrapper implements Packing{//包装的实现类,用纸
@Override
public String pack() {
return "Wrapper";
}
}
package BuildStudy;
public class Bottle implements Packing{//包装的实现类,用瓶子
@Override
public String pack() {
return "Bottle";
}
}
创建实现 Item 接口的抽象类,该类提供了默认的功能。
package BuildStudy;
public abstract class Burger implements Item{//抽象类实现返回包装类的方法
@Override
public Packing paking() {
return new Wrapper();
}
@Override
public abstract float price();//告诉你这个东西有价格,待定
}
package BuildStudy;
public abstract class ColdDrink implements Item{//抽象类实现返回包装类的方法
@Override
public Packing paking() {
return new Bottle();
}
@Override
public abstract float price();//告诉你这个东西有价格,待定
}
创建扩展了 Burger 和 ColdDrink 的实体类。
package BuildStudy;
public class VegBurger extends Burger{//具体的名字,价格实现类
@Override
public String name() {
return "Veg Burger";
}
@Override
public float price() {
return 25.5f;
}
}
package BuildStudy;
public class ChickenBurger extends Burger {//具体的名字,价格实现类
@Override
public String name() {
return "Chicken Burger";
}
@Override
public float price() {
return 50.5f;
}
}
package BuildStudy;
public class Coke extends ColdDrink {//具体的名字,价格实现类
@Override
public String name() {
return "Coke";
}
@Override
public float price() {
return 30.0f;
}
}
package BuildStudy;
public class Pepsi extends ColdDrink {//具体的名字,价格实现类
@Override
public String name() {
return "Pepsi";
}
@Override
public float price() {
return 35.5f;
}
}
创建一个 Meal 类,带有上面定义的 Item 对象。
package BuildStudy;
import java.util.ArrayList;
import java.util.List;
/**
* 重点理解一下这里,因为Meal对象是接收用户点餐和识别后台点餐的各种复杂项的中间桥梁
*/
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.println("item :"+item.name());
System.out.println("packing :" +item.paking().pack());
System.out.println("price :"+ item.price());
}
}
}
创建一个 MealBuilder 类,实际的 builder 类负责创建 Meal 对象。
package BuildStudy;
public class MealBuilder {
public Meal prepare (){
Meal meal = new Meal();
meal.addItem(new ChickenBurger());//加一个鸡肉汉堡
meal.addItem(new Coke());//加一杯冷饮
meal.addItem(new VegBurger());//加一个素食汉堡
meal.addItem(new Pepsi());//加一个披萨
//可以再点,没关系,只要有钱
//再加一个鸡肉汉堡
meal.addItem(new ChickenBurger());
return meal;
}
}
BuiderPatternDemo 使用 MealBuider 来演示建造者模式(Builder Pattern)。
package BuildStudy;
public class BuilderPatternDemo {
public static void main(String[] args){
MealBuilder mealBuilder = new MealBuilder();
Meal nonVegMeal = mealBuilder.prepare();
System.out.println("你好,您点餐信息:");
nonVegMeal.showItems();
System.out.println("Total Cost:" +nonVegMeal.getCost());
}
}
输出为:
相比于项目实现来说,你不用建造者模式又怎么实现呢? 有没有更好的呢?