创建型模式之生成器/建造者BUILDER

意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
这里写图片描述

一、介绍

建造者模式用于对于复杂对象的建立。由于复杂对象过于繁杂,采用一步一步建立的方式。
以KFC为例,KFC店食品可以自由组合,顾客可以根据需求点各种食品。这就需要我们首先的列出各种食品的信息,通过接口Item继承实现各种食物,然后使用一个容器Meal来承载这些食品,并提供各种操作方法。对于某些套餐,可以提供MealBuilder预先制定好套餐内食品。
这里写图片描述

二、建立单个食品

接口Item
集中各种食品类型,各种食品继承此接口,实现多态。

package builder;

public interface Item {
    public String name();
    public Packing setPacking();
    public float price();
}

分类继承
不同食品属于不同类别,可在此处添加不同类别的特殊属性

package builder;

public abstract class Burger implements Item {

    @Override
    public builder.Packing setPacking() {
        // TODO Auto-generated method stub
        return new Wrapper();
    }

}

具体食品

package builder;

public class VegBurger extends Burger {

    @Override
    public String name() {
        // TODO Auto-generated method stub
        return "VegBurger";
    }


    @Override
    public float price() {
        // TODO Auto-generated method stub
        return 10.0f;
    }
}

三、食品操作

最终顾客点餐会产生一系列食品。需要用类添加,并提供一些接口。比如添加食品、删除食品、计算总价等

package builder;

import java.util.*;

public class Meal {

    private List<Item> itemList = new ArrayList<Item>();

    public void addItem(Item item){
        itemList.add(item);
    }

    public float getCost(){
        float costTotal = 0.0f;
        for(Item i : itemList){
            costTotal += i.price();
        }
        return costTotal;
    }
}

四、生成套餐

有些顾客直接点一个套餐。我们可以事先生成这个套餐方法。

package builder;

public class MealBuilder {
    public Meal makeVegMeal(){
        Meal vegMeal = new Meal();
        vegMeal.addItem(new VegBurger());
        vegMeal.addItem(new Water());
        return vegMeal;
    }

    public Meal makeChiMeal(){
        Meal chiMeal = new Meal();
        chiMeal.addItem(new ChickenBurger());
        chiMeal.addItem(new Coke());
        return chiMeal;
    }
}

五、调用

package builder;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MealBuilder mealBuilder = new MealBuilder();
        Meal vegMeal = mealBuilder.makeVegMeal();
        float total = vegMeal.getCost();
        System.out.println(total);
    }

}

代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值