兄Die,写代码太累了?孤独寂寞冷?还没有女朋友吧?
关注微信公众号(瓠悠笑软件部落),送知识!送知识!送温暖!送工作!送女朋友!插科打诨哟!
建造者模式创建一个复杂的对象,使用简单的对象和使用一步一步的方法。这种类型的设计模式来自于创建型模式,作为这种模式提供了创建对象的最好的方法之一。
一个建造者类一步一步的创建最终的对象。这个建造者类是独立于其他对象的。
具体实现
我们考虑一种业务场景:一个快餐店里面的经典套餐可能是一个汉堡包和一杯冷饮。汉堡包是蔬菜汉堡包或者鸡肉汉堡包中的一种,而且要用包装袋装好。冷饮是可口可乐和百事可乐当中的一种,而且要用瓶子装好。
我们将创建一个叫做Item 的接口来表示食物项(例如汉堡包和冷饮),接着创建实现类(Burger和ColdDrink)来实现这个Item 接口,创建一个Packing接口来表示为食物打包。创建一些类(Wrapper和Bottle)来实现Packing接口。例如Wrapper类表示汉堡包必须用包装纸打包,另一个Bottle类表示饮料必须用瓶子来装。然后我们创建一个叫做Meal的类,它有一个数组列表(ArrayList)来存储Item对象,还要创建一个MealBuilder类根据Item来创建不用类型的Meal对象。最后我们创建BuilderPatternDemo类来测试我们的代码,我们将使用MealBuilder来新建一个Meal对象。
第一步:创建接口Item来表示食物和Packing来表示打包方式
Item.java
package com.patterns.builder;
public interface Item {
public String name();
public Packing packing();
public float price();
}
Packing.java
package com.patterns.builder;
public interface Packing {
public String pack();
}
第二步:创建相关的类来实现Packing接口
Wrapper.java
package com.patterns.builder;
public class Wrapper implements Packing{
public String pack() {
return"Wrapper";
}
}
Bottle.java
package com.patterns.builder;
public class Bottle implements Packing{
public String pack() {
return"Bottle";
}
}
第三步:创建一个抽闲类实现Item接口,提供默认的功能
Burger.java
package com.patterns.builder;
public abstract class Burger implements Item{
@Override
public Packing packing()
{
return new Wrapper();
}
@Override
public abstract float price();
}
ColdDrink.java
package com.patterns.builder;
public abstract class ColdDrink implements Item{
@Override
public Packing packing()
{
return new Bottle();
}
@Override
public abstract float price();
}
第四步:创建相应的类来继承抽象类Burger和ColdDrink
VegBurger.java
package com.patterns.builder;
public class VegBurger extends Burger{
@Override
public float price() {
return 25.0f;
}
public String name() {
return"Veg Burger";
}
}
ChickenBurger.java
package com.patterns.builder;
public class ChickenBurger extends Burger{
@Override
public float price() {
return 50.5f;
}
public String name() {
return "Chicken Burger";
}
}
Coke.java
package com.patterns.builder;
public class Coke extends ColdDrink{
@Override
public float price() {
return 30.0f;
}
public String name() {
return "Coke";
}
}
Pepsi.java
package com.patterns.builder;
public class Pepsi extends ColdDrink {
@Override
public float price() {
return 35.0f;
}
public String name() {
return "Pepsi";
}
}
第五步:创建一个Meal类,含有Item objects
Meal.java
package com.patterns.builder;
import java.util.ArrayList;
import java.util.List;
public class Meal {
private List<Item> items =new ArrayList<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.print("Item : "+ item.name());
System.out.print(", Packing : "+ item.packing().pack());
System.out.println(", Price : "+ item.price());
}
}
}
第六步:创建一个MealBuilder 类,他是实际的建造类,负责创建Meal对象
MealBuilder.java
package com.patterns.builder;
import java.util.ArrayList;
import java.util.List;
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.print("Item : "+ item.name());
System.out.print(", Packing : "+ item.packing().pack());
System.out.println(", Price : "+ item.price());
}
}
}
**第七步:新建BuiderPatternDemo 类,在里面使用MealBuider来颜色构建者模式 **
BuilderPatternDemo.java
package com.patterns.builder;
public class BuilderPatternDemo {
public static void main(String args[])
{
MealBuilder mealBuilder =new MealBuilder();
Meal vegMeal = mealBuilder.prepareVegMeal();
System.out.println("Veg Meal");
vegMeal.showItems();
System.out.println("Total Cost: "+ vegMeal.getCost());
Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
System.out.println("\n\nNon-Veg Meal");
nonVegMeal.showItems();
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 Cost: 55.0
Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5