文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php教程>设计模式之建造者模式详解(定义、优缺点、应用场景、实例类图)

设计模式之建造者模式详解(定义、优缺点、应用场景、实例类图)

时间:2024-12-09  来源:互联网  标签: PHP教程

建造者模式是一种创建型设计模式,它允许你创建复杂对象的步骤与表示方式相分离。建造者模式是一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程与其表示相分离,从而可以创建具有不同表示形式的对象。与工厂模式的区别是:建造者模式更加关注于零件装配的顺序。

一、建造者模式的概要

意图

将一个复杂的构建过程与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决

在软件系统中,一个复杂对象的创建通常由多个部分组成,这些部分的组合经常变化,但组合的算法相对稳定。

何时使用

当一些基本部件不变,而其组合经常变化时。

如何解决

将变与不变的部分分离开。

关键代码

  • 建造者:创建并提供实例。

  • 导演:管理建造出来的实例的依赖关系和控制构建过程。

  • 结构

    建造者模式包含以下几个主要角色:

  • 产品(Product):要构建的复杂对象。产品类通常包含多个部分或属性。

  • 抽象建造者(Builder):定义了构建产品的抽象接口,包括构建产品的各个部分的方法。

  • 具体建造者(Concrete Builder):实现抽象建造者接口,具体确定如何构建产品的各个部分,并负责返回最终构建的产品。

  • 指导者(Director):负责调用建造者的方法来构建产品,指导者并不了解具体的构建过程,只关心产品的构建顺序和方式。

  • 应用实例

  • 去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出不同的"套餐"。

  • Java 中的 StringBuilder。

  • 二、建造者模式的使用场景

  • 需要生成的对象具有复杂的内部结构。

  • 需要生成的对象内部属性相互依赖。

  • 三、建造者模式的优缺点

    优点

  • 分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。

  • 可以更好地控制构建过程,隐藏具体构建细节。

  • 代码复用性高,可以在不同的构建过程中重复使用相同的建造者。

  • 缺点

  • 如果产品的属性较少,建造者模式可能会导致代码冗余。

  • 增加了系统的类和对象数量。

  • 四、建造者模式的实现

    我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(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。

    建造者模式

    1. 步骤 1:创建一个表示食物条目和食物包装的接口。

    Item.java

    publicinterfaceItem{
    publicStringname();
    publicPackingpacking();
    publicfloatprice();
    }

    Packing.java

    publicinterfacePacking{
    publicStringpack();
    }
  • 步骤 2:创建实现 Packing 接口的实体类。

  • Wrapper.java

    publicclassWrapperimplementsPacking{
    
    @Override
    publicStringpack(){
    return"Wrapper";
    }
    }

    Bottle.java

    publicclassBottleimplementsPacking{
    
    @Override
    publicStringpack(){
    return"Bottle";
    }
    }
  • 步骤 3:创建实现 Item 接口的抽象类,该类提供了默认的功能。

  • Burger.java

    publicabstractclassBurgerimplementsItem{
    
    @Override
    publicPackingpacking(){
    returnnewWrapper();
    }
    
    @Override
    publicabstractfloatprice();
    }

    ColdDrink.java

    publicabstractclassColdDrinkimplementsItem{
    
    @Override
    publicPackingpacking(){
    returnnewBottle();
    }
    
    @Override
    publicabstractfloatprice();
    }
  • 步骤 4:创建扩展了 Burger 和 ColdDrink 的实体类。

  • VegBurger.java

    publicclassVegBurgerextendsBurger{
    
    @Override
    publicfloatprice(){
    return25.0f;
    }
    
    @Override
    publicStringname(){
    return"VegBurger";
    }
    }

    ChickenBurger.java

    publicclassChickenBurgerextendsBurger{
    
    @Override
    publicfloatprice(){
    return50.5f;
    }
    
    @Override
    publicStringname(){
    return"ChickenBurger";
    }
    }

    Coke.java

    publicclassCokeextendsColdDrink{
    
    @Override
    publicfloatprice(){
    return30.0f;
    }
    
    @Override
    publicStringname(){
    return"Coke";
    }
    }

    Pepsi.java

    publicclassPepsiextendsColdDrink{
    
    @Override
    publicfloatprice(){
    return35.0f;
    }
    
    @Override
    publicStringname(){
    return"Pepsi";
    }
    }
  • 步骤 5:创建一个 Meal 类,带有上面定义的 Item 对象。

  • Meal.java

    importjava.util.ArrayList;
    importjava.util.List;
    
    publicclassMeal{
    privateList<Item>items=newArrayList<Item>();
    
    publicvoidaddItem(Itemitem){
    items.add(item);
    }
    
    publicfloatgetCost(){
    floatcost=0.0f;
    for(Itemitem:items){
    cost+=item.price();
    }
    returncost;
    }
    
    publicvoidshowItems(){
    for(Itemitem:items){
    System.out.print("Item:"+item.name());
    System.out.print(",Packing:"+item.packing().pack());
    System.out.println(",Price:"+item.price());
    }
    }
    }
  • 步骤 6:创建一个 MealBuilder 类,实际的 builder 类负责创建 Meal 对象。

  • MealBuilder.java

    publicclassMealBuilder{
    
    publicMealprepareVegMeal(){
    Mealmeal=newMeal();
    meal.addItem(newVegBurger());
    meal.addItem(newCoke());
    returnmeal;
    }
    
    publicMealprepareNonVegMeal(){
    Mealmeal=newMeal();
    meal.addItem(newChickenBurger());
    meal.addItem(newPepsi());
    returnmeal;
    }
    }
  • 步骤 7:BuiderPatternDemo 使用 MealBuilder 来演示建造者模式(Builder Pattern)。

  • BuilderPatternDemo.java

    publicclassBuilderPatternDemo{
    publicstaticvoidmain(String[]args){
    MealBuildermealBuilder=newMealBuilder();
    
    MealvegMeal=mealBuilder.prepareVegMeal();
    System.out.println("VegMeal");
    vegMeal.showItems();
    System.out.println("TotalCost:"+vegMeal.getCost());
    
    MealnonVegMeal=mealBuilder.prepareNonVegMeal();
    System.out.println("\n\nNon-VegMeal");
    nonVegMeal.showItems();
    System.out.println("TotalCost:"+nonVegMeal.getCost());
    }
    }
  • 步骤 8:执行程序,输出结果:

  • VegMeal
    Item:VegBurger,Packing:Wrapper,Price:25.0
    Item:Coke,Packing:Bottle,Price:30.0
    TotalCost:55.0
    
    
    Non-VegMeal
    Item:ChickenBurger,Packing:Wrapper,Price:50.5
    Item:Pepsi,Packing:Bottle,Price:35.0
    TotalCost:85.5

    以上就是php小编整理的全部内容,希望对您有所帮助,更多相关资料请查看php教程栏目。

    相关阅读更多 +
    最近更新
    排行榜 更多 +
    元梦之星最新版手游

    元梦之星最新版手游

    棋牌卡牌 下载
    我自为道安卓版

    我自为道安卓版

    角色扮演 下载
    一剑斩仙

    一剑斩仙

    角色扮演 下载