设计模式之建造者模式

简介

建造者模式(Builder Pattern),也称生成器模式。使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

或者说将一个复杂对象的构建与它的表示分离、使得同样的构建过程可以创建不同的表示。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
介绍

优点:

  1. 建造者独立,容易扩展。
  2. 便于控制细节风险。
  3. 封装性

缺点:

  1. 产品必须有共同点,范围有限制。
  2. 如内部变化复杂,会有很多的建造类。

注意:建造者模式关注的是零件类型和装配的工艺,这是它与工厂方法模式最大不同的地方

通用类图

例如:

引用菜鸟教程的例子:
我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。

我们将创建一个表示食物条目(比如汉堡和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。

然后我们创建一个 Meal 类,带有 Item 的 ArrayList 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilder。BuilderPatternDemo,我们的演示类使用 MealBuilder 来创建一个 Meal。
http://www.runoob.com/design-pattern/builder-pattern.html

画出类图:

java实现

创建表示食物和食物包装的接口:

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

    public interface Packing {
        String pack();
    }

将食物类设置为抽象,并实现item接口

public abstract class Burger implements Item {

        public Packing packing() {
            //汉堡使用的是纸包装
            return new Wrapper();
        }
        public abstract float price();
    }

    public abstract class Drink implements Item {

        public Packing packing() {
            //饮料使用的是瓶子包装
            return new Bottle();
        }
        public abstract float price();
    }

创建包装的实现类

public class Wrapper implements Packing {
        public String pack() {
            return "Wrapper";
        }
    }

    public class Bottle implements Packing {
        public String pack() {
            return "Bottle";
        }
    }

创建各类食品的实现类

public class ChickenBurger extends Burger {

        @Override
        public String name() {
            return "ChickenBurger";
        }
        @Override
        public float price() {
            return 151.23f;
        }
    }

    public class VegBurger extends Burger {

        @Override
        public String name() {
            return "VegBurger";
        }

        @Override
        public float price() {
            return 23.13f;
        }
    }

    public class Coke extends Drink {

        @Override
        public String name() {
            return "Coke";
        }

        @Override
        public float price() {
            return 15.23f;
        }
    }

    public class Pepsi extends Drink {

        @Override
        public String name() {
            return "Pepsi";
        }

        @Override
        public float price() {
            return 23.65f;
        }
    }

Meal类

    public class Meal {

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


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

        public float getCost() {
            float cost = 0;
            for (Item i : items) {
                cost+=i.price();
            }
            return cost;
        }

        public void showItem() {
            for (Item item : items){
                System.out.println(item.name()+"=="+item.packing().pack()+"=="+item.price());
            }
        }

    }

MealBuilder类:负责Meal的创建

public class MealBuilder {


        public Meal builderVegMeal() {
            Meal meal = new Meal();
            meal.addItem(new VegBurger());
            meal.addItem(new Coke());
            return meal;
        }

        public Meal builderChickMeal() {
            Meal meal = new Meal();
            meal.addItem(new ChickenBurger());
            meal.addItem(new Pepsi());
            return meal;
        }

    }

场景类

    public class BuliderPatternDemo {
        public static void main(String[] args){
            MealBuilder mealBuilder = new MealBuilder();
            Meal meal = mealBuilder.builderChickMeal();
            meal.showItem();
            meal.getCost();
            System.out.println("========");

            Meal meal1 = mealBuilder.builderVegMeal();
            meal1.showItem();
            meal1.getCost();
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值