设计模式学习笔记--建造者模式

本文介绍了建造者模式的概念,通过一个快餐店的商业案例展示了如何使用建造者模式来构建复杂的对象,如汉堡和冷饮套餐。文章详细阐述了模式的实现步骤,包括创建接口、实现接口、创建抽象类、实体类以及构建器,并提供了演示代码和输出结果。
摘要由CSDN通过智能技术生成

四、建造者模式

建造者模式(Builder Pattern)使用多个简单对象逐步创建一个复杂对象。Builder类独立于其他对象。

简介

该模式意图使复杂的构建与其表示相分离,使得同样的构建过程可以有不同的表示。面向于复杂对象的创建,且复杂对象由多个简单对象部分组成。

主要用于整体基本部件不变而部分结构存在变化的对象的构建。形象的讲就是不同的套餐,由各种基本食物组成,类似的模式。

实现

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

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

然后我们创建一个 Meal 类,带有 ItemArrayList 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilderBuilderPatternDemo,我们的演示类使用 MealBuilder 来创建一个 Meal

builder

创建接口

创建一个表示事物条目和实物包装的接口

Item.java

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

Packing.java

public interface Packing{
  public String pack();
}

实现接口

Wrapper.java

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

Bottle.java

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

创建实现接口的抽象类

Burger.java

public abstract class Burger implements Item {
  @override
  public Packing packing(){
    return new Wrapper();
  }
  @override
  public abstract float price();
}

ColdDrink.java

public abstract class ColdDrink implements Item {
  @override
  public Packing packing(){
    return new Bottle();
  }
  @override
  public abstract float price();
}

创建Burger和ColdDrink的实体类

VegBurger.java

public class VegBurger extends Burger {
  @override
  public float price(){
    return 25.0f;
  }
  @override
  public String name(){
    return "Veg Burger";
  }
}

ChickenBurger.java

public class ChickenBurger extends Burger {
  @override
  public float price(){
    return 50.5f;
  }
  @override
  public String name(){
    return "Chicken Burger";
  }
}

Coke.java

public class Coke extends ColdDrink {
  @override
  public float price(){
    return 30.0f;
  }
  @override
  public String name(){
    return "Coke";
  }
}

Pepsi.java

public class Pepsi extends ColdDrink{
  @override
  public float price(){
    return 35.0f;
  }
  @override
  public String name(){
    return "Pepsi";
  }
}

创建组合类

创建一个Meal类,组合上述item

Meal.java

import java.util.ArrayList;
import java.util.List;
public class Meal {
  private List<Item> items = new ArrayList<Item>();

  public void addItem(Item item){
    items.add(item);
  }
  public float getCost(){
    float cost = 0.0f;
    for(Item item:items){
      cost+=itemt.price();
    }
    return cost;
  }

  public void showItems(){
    for(Item item:items){
      System.out.print("Item : " + item.name());
      System.out.print(", Packing : "+ item.packing().pack());
      System.out.println(", Price : " + item.price());
    }
  }
}

创建Builder

创建一个MealBuilder类,实际的builder类负责创建Meal对象。

MealBuilder.java

public class MealBuilder {
  public Meal prepareVegMeal (){
    Meal meal = new Meal();
    meal.addItem(new VegBurger());
    meal.addItem(new Coke());
    return meal;
  }
  public Meal prepareNonVegBurger(){
    Meal meal = new Meal();
    meal.addItem(new ChickenBurger());
    meal.addItem(new Pepsi());
    return meal;
  }
}

演示

BuilderPatternDemo.java

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

    Meal vegMeal = builder.prepareVegMeal();
    System.out.println("Veg Meal");
    vegMeal.showItems();
    System.out.pringln("Total Cost : " + vegMeal.getCost());

    Meal nogVegMeal = builder.prepareNonVegMeal();
    System.out.print("\n \n Non-Veg Meal");
    nonVegMeal.showItems();
    System.out.println("Total Cost : "+ nonVegMeal.getCost());
  }
}

输出

Veg Meal
Item : Veg Burger,Packing:Wrapper,Price:25.0
Item : Coke,Packing:Bottle,Price:30.0
Total Cost 55.0

Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值