设计模式之建造者模式

本文介绍了建造者模式,一种用于创建复杂对象的设计模式。通过将不变元素与可变部分分离,建造者模式允许创建不同组合的产品。文章展示了如何在Java中实现建造者模式,以快餐店套餐为例,包括汉堡、冷饮等不同组合。同时,文章提到了适用场景、优缺点以及与工厂模式的区别。
摘要由CSDN通过智能技术生成

介绍

表示:将过程表示为一个不同的企业,同样的不同的产品可以创建。

解决方案:主要解决在系统中,其复杂性的“背景”是一个复杂的工作,通常由对象的不同部分,这个子用对象的某种算法组成;需求对象的软件部分的任务部分着剧烈的变化,将他们组合的模式却相对稳定。

使用:一些基本元件不会改变,而其组合的时候经常。

如何解决:将变与不变分离开。

关键代码

构建者:创建和提供实例,

导演:管理构建出来的实例的依赖关系。

应用实例:

1、去肯德基,汉堡、可乐、薯条、炸鸡翅等都是不变的,而组合是变化的,生成其出的“套餐”。

2、JAVA中的StringBuilder。

2 、便于控制细节,便于独立扩展。

1、产品必须有共同点 ,范围有限制。

2、如内部变化复杂,会有很多的构建类。

使用场景:

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

2、需要生成的对象属性相互依赖。

注意:与工厂模式的区别是:建造者关注的事项与装配的顺序。

实现

我们一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(冷饮)。 汉堡(Burger)可以是汉堡店(Veg Burger)鸡肉或汉堡(Chicken Burger),冷饮(冷饮)可以是可口可乐(可乐)或百事可乐(百事可乐),它们是装在瓶子里。

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

然后我们创建一个Meal类,不同Pattern的ArrayList和一个通过结合Item来创建Meal对象的MealBuilder。BuilderDemo类使用MealBuilder来一个Meal。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MIhVtjb1-1678261116991)(null)]

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

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

创建实现 Packing 接口的实体类

public class Wrapper implements Packing {

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

   @Override
   public String pack() {
      return "Bottle";
   }
}

创建实现 Item 接口的抽象类,该类提供了默认的功能

public abstract class Burger implements Item {

   @Override
   public Packing packing() {
      return new Wrapper();
   }

   @Override
   public abstract float price();
}
public abstract class ColdDrink implements Item {

    @Override
    public Packing packing() {
       return new Bottle();
    }

    @Override
    public abstract float price();
}

创建扩展了 Burger 和 ColdDrink 的实体类

public class VegBurger extends Burger {

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

   @Override
   public String name() {
      return "Veg Burger";
   }
}
public class ChickenBurger extends Burger {

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

   @Override
   public String name() {
      return "Chicken Burger";
   }
}
public class Coke extends ColdDrink {

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

   @Override
   public String name() {
      return "Coke";
   }
}
public class Pepsi extends ColdDrink {

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

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

创建一个 Meal 类,带有上面定义的 Item 对象

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 += item.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());
      }        
   }    
}
public class MealBuilder {

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

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

BuiderPatternDemo 使用 MealBuilder 来演示建造者模式(Builder Pattern)

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

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

      Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
      System.out.println("\n\nNon-Veg Meal");
      nonVegMeal.showItems();
      System.out.println("Total Cost: " +nonVegMeal.getCost());
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值