Java 设计模式 — 建造者模式(4)

一、浅谈建造者模式

建造者模式会将多个简单的对象一步步构建成一个复杂的对象。显然,这种设计模式也属于创建型模式。这种模式同样也提供了创建对象的最佳方式。xxxBuilder 类会一步步去构造最终我们所需的对象,但是 xxxBuilder 类独立于其它的对象。

建造者模式有点像高中我们数学所学的排列组合,它将不同种类的产品相互组合,得到很多种排列方式。就好比我们日常生活中,在餐馆点餐,餐馆会向我们推荐单人餐、四人餐、六人餐等等之类的套餐,不同种类的菜品排列组合成了套餐。在建造者模式中,我们也可以将其形象的理解为"套餐"。

"套餐" 在建造者模式如何体现呢?下面我们看代码来一起理解~

二、测试代码

1)代码架构图

 2)代码包图

 3)代码

Interface

<1> PackageFood

public interface PackageFood {
    String packageFood();
}

 <2> Food

public interface Food {
    String foodName();
    double foodPrice();
    PackageFood packageInstance();
}

ImplPackage

<1> Cup

public class Cup implements PackageFood {
    @Override
    public String packageFood() {
        return "Use a cup to package.";
    }
}

<2> Plate

public class Plate implements PackageFood {
    @Override
    public String packageFood() {
        return "Use a plate to package.";
    }
}

AbstractClass

<1> Dishes

public abstract class Dishes implements Food {
    @Override
    public PackageFood packageInstance() {
        return new Plate();
    }
}

<2> Drinks

public abstract class Drinks implements Food {
    @Override
    public PackageFood packageInstance() {
        return new Cup();
    }
}

Bean

1)DishesBean

<1> Mapo Tofu

public class MapoTofu extends Dishes {
    @Override
    public String foodName() {
        return "Mapo Tofu";
    }

    @Override
    public double foodPrice() {
        return 16.32D;
    }
}

<2> Rice

public class Rice extends Dishes {
    @Override
    public String foodName() {
        return "Rice";
    }

    @Override
    public double foodPrice() {
        return 1.00D;
    }
}

<3> ZongZi

public class ZongZi extends Dishes {
    @Override
    public String foodName() {
        return "ZongZi";
    }

    @Override
    public double foodPrice() {
        return 8.78D;
    }
}

2)DrinksBean

<1> FruitTea

public class FruitTea extends Drinks {
    @Override
    public String foodName() {
        return "Fruit Tea";
    }

    @Override
    public double foodPrice() {
        return 18.20D;
    }
}

<2> HuiYuanJuice

public class HuiYuanJuice extends Drinks {
    @Override
    public String foodName() {
        return "HuiYuan Juice";
    }

    @Override
    public double foodPrice() {
        return 10.00D;
    }
}

Meal

public class Meal {
    private final ArrayList<Food> foods = new ArrayList<>();

    public void addFood(Food food) {
        foods.add(food);
    }

    public void totalPrice() {
        double cost = 0.0D;
        for (Food food : foods) {
            cost += food.foodPrice();
        }
        System.out.println("总费用为: " + cost);
    }

    public void whatFood() {
        for (Food food : foods) {
            System.out.println(food.foodName() + " "
                    + food.foodPrice() + " "
                    + food.packageInstance().packageFood());
        }
    }
}

MealBuilder

public class MealBuilder {

    /**
     * 套餐一
     * prepareFirstSetOfDish
     * @return Meal
     */
    public Meal prepareFirstSetOfDish() {
        Meal meal = new Meal();
        meal.addFood(new MapoTofu());
        meal.addFood(new Rice());
        meal.addFood(new HuiYuanJuice());
        return meal;
    }

    /**
     * 套餐二
     * prepareFirstSetOfDish
     * @return Meal
     */
    public Meal prepareSecondSetOfDish() {
        Meal meal = new Meal();
        meal.addFood(new MapoTofu());
        meal.addFood(new ZongZi());
        meal.addFood(new FruitTea());
        return meal;
    }

    /**
     * 四人餐
     * prepareFourPersonDish
     * @return Meal
     */
    public Meal prepareFourPersonDish () {
        Meal meal = new Meal();
        meal.addFood(new MapoTofu());
        meal.addFood(new ZongZi());
        meal.addFood(new Rice());
        meal.addFood(new FruitTea());
        meal.addFood(new HuiYuanJuice());
        return meal;
    }
}

Test 测试类

public class Test {
    public static void main(String[] args) {
        MealBuilder mealBuilder = new MealBuilder();

        // 套餐一
        System.out.println("套餐一");
        Meal mealFirst = mealBuilder.prepareFirstSetOfDish();
        mealFirst.whatFood();
        mealFirst.totalPrice();

        System.out.println();

        // 套餐二
        System.out.println("套餐二");
        Meal mealSecond = mealBuilder.prepareSecondSetOfDish();
        mealSecond.whatFood();
        mealSecond.totalPrice();

        System.out.println();

        // 四人餐
        System.out.println("四人餐");
        Meal fourPersonMeal = mealBuilder.prepareFourPersonDish();
        fourPersonMeal.whatFood();
        fourPersonMeal.totalPrice();
    }
}

测试结果

套餐一
Mapo Tofu 16.32 Use a plate to package.
Rice 1.0 Use a plate to package.
HuiYuan Juice 10.0 Use a cup to package.
总费用为: 27.32

套餐二
Mapo Tofu 16.32 Use a plate to package.
ZongZi 8.78 Use a plate to package.
Fruit Tea 18.2 Use a cup to package.
总费用为: 43.3

四人餐
Mapo Tofu 16.32 Use a plate to package.
ZongZi 8.78 Use a plate to package.
Rice 1.0 Use a plate to package.
Fruit Tea 18.2 Use a cup to package.
HuiYuan Juice 10.0 Use a cup to package.
总费用为: 54.3

总结:

建造者模式是将不同的简单类经过一系列操作,最终构建为一个复杂对象的过程。建造者模式更关注的时零件装配的过程。建造者模式通常使用在一些基础组件不改变,但是组合经常会发生变化的时候。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值