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

来源:互联网 发布:mysql可视化建立外键 编辑:程序博客网 时间:2024/05/20 00:13

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

一、介绍

建造者模式用于对于复杂对象的建立。由于复杂对象过于繁杂,采用一步一步建立的方式。
以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
原创粉丝点击