NO3-java中设计模式之建造者模式

说明

参考文献: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 对象的 MealBuilderBuilderPatternDemo,我们的演示类使用 MealBuilder 来创建一个 Meal

项目模式图

项目目录

 

项目代码说明(实践出真知)

创建一个表示食物条目和食物包装的接口。

扫描二维码关注公众号,回复: 4143860 查看本文章

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());

}

}

 

输出为:

 

相比于项目实现来说,你不用建造者模式又怎么实现呢? 有没有更好的呢?

猜你喜欢

转载自blog.csdn.net/Mr_carry/article/details/81948067