设计模式之建造者模式

127 阅读2分钟

意图

将一个复杂的对象拆解成若干个简单的对象,由一个组装者将简单对象一个复杂对象,简单对象基本不变,但是组合的方式可变。

何时使用

一些基本部件不变而其组合经常变化的时候

实现

我们假设一个快餐店,其中汉堡,可乐等物品基本不会变,但是组合而成的套餐却有很多种。

创建食物条目和包装的接口
public interface Item {
    String name();
    Float price();
    Packing packing();
}
public interface Packing {
    String packing();
}
创建实现packing接口的实体类
public class Bottle implements Packing {
    @Override
    public String packing() {
        return "Bottle";
    }
}
public class Wrapper implements Packing {
    @Override
    public String packing() {
        return "Wrapper";
    }
}
创建item的抽象类提供默认功能
public abstract class Drink implements Item {

    @Override
    public abstract Float price();

    @Override
    public Packing packing() {
        return new Bottle();
    }
}
public abstract class Food implements Item {

    @Override
    public abstract Float price();

    @Override
    public Packing packing() {
        return new Wrapper();
    }
}
扩展Food和Drink类
public  class Chicken extends Food {
    @Override
    public String name() {
        return "Chicken";
    }

    @Override
    public Float price() {
        return 15f ;
    }
}
public class Hamburger extends Food{
    @Override
    public String name() {
        return "Hamburger";
    }

    @Override
    public Float price() {
        return 20f;
    }
}
public class Cola extends Drink {
    @Override
    public String name() {
        return "Cola";
    }

    @Override
    public Float price() {
        return 10f;
    }
}
public class Pepsi extends Drink {
    @Override
    public String name() {
        return "Pepsi";
    }

    @Override
    public Float price() {
        return 7f;
    }
}
创建一个Meal类,也就是上面所说的复杂的对象,由item组成
public class Meal {
    List<Item> items = new ArrayList<>();

    public void itemAdd(Item item){
        items.add(item);
    }

    public Float getCost() {
        float total = 0f;
        for (Item item : items) {
             total += item.price();
        }
        return total;
    }

    public void showMeal() {
        for (Item item : items) {
           System.out.println("name:"+item.name());
           System.out.println("packing:"+item.packing().packing());
        }
        System.out.println("价格为;"+getCost());
    }
}
创建一个建造者去组合对象
public class MealBuilder {
    public Meal packages1() {
        Meal meal = new Meal();
        meal.itemAdd(new Cola());
        meal.itemAdd(new Chicken());
        return meal;
    }

    public Meal packages2() {
        Meal meal = new Meal();
        meal.itemAdd(new Pepsi());
        meal.itemAdd(new Hamburger());
        return meal;
    }
}
演示
public class BuilderPatternDemo {
    public static void main(String[] args) {
        MealBuilder mealBuilder = new MealBuilder();
        mealBuilder.packages1().showMeal();
        mealBuilder.packages2().showMeal();
    }
}
结果
name:Cola
packing:Bottle
name:Chicken
packing:Wrapper
价格为;25.0

name:Pepsi
packing:Bottle
name:Hamburger
packing:Wrapper
价格为;27.0