建造者模式

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

定义

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

建造者模式包含如下角色:
Builder:抽象建造者
ConcreteBuilder:具体建造者
Director:指挥者
Product:产品角色

img_d114472ea8101a58267a140616f55ab9.png
img_8f179d8d725b2b1569d5ab9a4498ae5d.png

实现

我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。

汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。

冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。

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

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

img_d9fdd51b30545b4fb009c9a47846422d.jpe
建造者模式的 UML 图
步骤 1
创建一个表示食物条目和食物包装的接口。
Item.java
public interface Item {
   public String name();
   public Packing packing();
   public float price();    
}
Packing.java
public interface Packing {
   public String pack();
}
步骤 2
创建实现 Packing 接口的实体类。
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";
   }
}
步骤 3
创建实现 Item 接口的抽象类,该类提供了默认的功能。
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();
}
步骤 4
创建扩展了 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";
   }
}
步骤 5
创建一个 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 += 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());
      }     
   }    
}
步骤 6
创建一个 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 prepareNonVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new ChickenBurger());
      meal.addItem(new Pepsi());
      return meal;
   }
}
步骤 7
BuiderPatternDemo 使用 MealBuider 来演示建造者模式(Builder Pattern)。
BuilderPatternDemo.java
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());
   }
}
步骤 8
验证输出。
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
相关文章
|
机器学习/深度学习 算法 搜索推荐
《朴素贝叶斯:开启客户细分与精准营销的智能引擎》
在竞争激烈的商业环境中,客户细分和精准营销至关重要。朴素贝叶斯算法基于贝叶斯定理,假设特征独立,通过计算特征概率实现高效分类。该算法帮助企业深入理解客户,优化资源利用。通过收集多维度数据、特征提取与预处理、模型训练及客户分类,企业能制定个性化营销策略,提升转化率和客户忠诚度。某电商平台的成功案例显示,该算法显著提高了营销效果和投资回报率。
430 20
|
设计模式 安全 Java
设计模式之单例模式
设计模式之单例模式
|
存储 安全 网络安全
云计算与网络安全:探索云服务、网络安全和信息安全的交汇点
【10月更文挑战第40天】 在数字化时代,云计算已成为企业和个人存储、处理数据的重要工具。然而,随着云服务的快速发展,网络安全问题也日益突出。本文将深入探讨云计算与网络安全的关系,分析云服务中的安全挑战,并提出相应的解决方案。通过本文,您将了解到如何在享受云计算带来的便利的同时,保护您的数据免受网络威胁。
|
存储 索引
Julia 数组
Julia中的数组是可变的、类型可异的集合,支持一维和多维。数组通过方括号创建,元素间用逗号分隔。例如,`[1,2,3]` 创建了一个整数向量,而 `[1, &quot;baidu&quot;, 2.5, pi]` 创建了包含不同类型的数组。指定类型可用如 `Int64[1,2,3]` 或 `String[&quot;Taobao&quot;,&quot;baidu&quot;,&quot;GOOGLE&quot;]`。
|
弹性计算 缓存 数据库
阿里云服务器2核4G配置有哪些选择?2024年租用费用
阿里云服务器2核4G配置有哪些选择?2024年租用费用,2核4G配置1个月多少钱?2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年
|
机器学习/深度学习 自然语言处理 IDE
自动写代码指日可待!Facebook迁移学习新突破,代码补全准确率超50%!(一)
程序员的工作就是取代重复、算法可替代的工作,而他们自己也在研究如何取代自己。Facebook新发表的代码补全模型准确率超50%,动动手指就能写几百行代码!
351 0
自动写代码指日可待!Facebook迁移学习新突破,代码补全准确率超50%!(一)
|
存储 SQL 负载均衡
冷热分离之OTS表格存储实战[云栖版]
为什么要冷热分离由于2020疫情的原因,在线教育行业提前被大家所重视,钉钉教育已经服务超过21万所学校、700万教师和1.4亿学生用户,每天大量的教育数据产生。整体数据量:随着时间的积累,数据量越来直大,庞大的数据量对稳定性与性能是一个很大的挑战。当前策略:分库分表,对于大单表的场景,第一个能跳出脑海的就是分库分表。在中国互联网技术圈流传着这么一个说法:MySQL 单表数据量大于 2000 万行,
2009 0
冷热分离之OTS表格存储实战[云栖版]
|
SQL 存储 监控
用户指南—诊断与优化—SQL审计与分析—开启SQL审计与分析
PolarDB-XSQL日志审计功能默认关闭,您可以在控制台上手动开启。
199 0
为什么需要企业邮箱?
企业邮箱作为企业进行国内外事务,商务交流的基本途径之一,其安全性、稳定性将对企业的商务等活动有着重要的影响。而企业邮箱专业的设备,专业的技术队伍,可以使通信过程中的企业资料和商务信息得到最大程度的保护。
1005 0
Node.js 性能平台 alinode 新版本发布
信息摘要: 本次发布 alinode 5.x 版本,兼容官方 Node.js v12 系列。适用客户: 适用于使用 Node.js 的企业或个人开发者,尤其是拥有大流量,对性能敏感的客户。版本/规格功能: 发布 alinode 5.x 系列版本,对应 Node.js v12 版本。
1899 0

热门文章

最新文章