06@设计模式-(04)建造者模式

兄Die,写代码太累了?孤独寂寞冷?还没有女朋友吧?
关注微信公众号(瓠悠笑软件部落),送知识!送知识!送温暖!送工作!送女朋友!插科打诨哟!
huyouxiao.com
建造者模式创建一个复杂的对象,使用简单的对象和使用一步一步的方法。这种类型的设计模式来自于创建型模式,作为这种模式提供了创建对象的最好的方法之一。

一个建造者类一步一步的创建最终的对象。这个建造者类是独立于其他对象的。
具体实现
我们考虑一种业务场景:一个快餐店里面的经典套餐可能是一个汉堡包和一杯冷饮。汉堡包是蔬菜汉堡包或者鸡肉汉堡包中的一种,而且要用包装袋装好。冷饮是可口可乐和百事可乐当中的一种,而且要用瓶子装好。

我们将创建一个叫做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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值