什么是建造者模式(Builder Pattern)?

根据定义,将复杂对象的创建与其表示分开。这将允许您重用相同的构造过程来创建同一对象的不同表示。换句话说,Builder 通过一步一步的过程来创建对象。它还解耦了对象的创建方式,因此相同的设置可以创建对象的不同表示。

您可能会想它与我们之前讨论的抽象工厂设计模式有何不同?抽象工厂通常会立即返回对象,因为 Builder 有复杂的逐步过程来为您构建对象。构建器首先实例化对象并遵循所有必要步骤以确保对象已准备好使用。

应用实例

1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。
2、JAVA 中的 StringBuilder。

优点

1、建造者独立,易扩展。2、便于控制细节风险。

缺点

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

使用场景

1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

实现

我们假设一个披萨店的商业案例,其中,一个典型的套餐可以是一个披萨(Pizza)和一杯冷饮(Cold drink)。披萨(Pizza)可以是素食披萨(Veg Pizza)或芝士披萨(Cheese Pizza),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。
我们将创建一个表示食物条目(比如披萨和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,披萨是包在纸盒中,冷饮是装在瓶子中。
然后我们创建一个 Meal 类,带有 Item 的 List 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilder。BuilderPatternDemo 类使用 MealBuilder 来创建一个 Meal。

UML

  1. 创建一个表示食物条目和食物包装的接口。
INTERFACE if_packing.METHODS packRETURNING VALUE(rv_name) TYPE string.
ENDINTERFACE.INTERFACE if_item.METHODS:nameRETURNING VALUE(rv_name) TYPE string,packingRETURNING VALUE(ro_packing) TYPE REF TO if_packing,priceRETURNING VALUE(rv_price) TYPE price.
ENDINTERFACE.
  1. 创建实现 Packing 接口的实体类。
CLASS cl_wrapper DEFINITION.PUBLIC SECTION.INTERFACES if_packing.
ENDCLASS.CLASS cl_wrapper IMPLEMENTATION.METHOD  if_packing~pack.rv_name = 'Wrapper'.ENDMETHOD.
ENDCLASS.CLASS cl_bottle  DEFINITION.PUBLIC SECTION.INTERFACES if_packing.
ENDCLASS.CLASS cl_bottle IMPLEMENTATION.METHOD  if_packing~pack.rv_name = 'Bottle'.ENDMETHOD.
ENDCLASS.
  1. 创建实现 Item 接口的抽象类,该类提供了默认的功能。
CLASS cl_pizza DEFINITION ABSTRACT.PUBLIC SECTION.INTERFACES if_item.
ENDCLASS.CLASS cl_pizza IMPLEMENTATION.METHOD if_item~packing.ro_packing = NEW cl_wrapper( ).ENDMETHOD.METHOD if_item~name.ENDMETHOD.METHOD if_item~price.ENDMETHOD.
ENDCLASS.CLASS cl_cold_drink  DEFINITION ABSTRACT.PUBLIC SECTION.INTERFACES if_item.ENDCLASS.CLASS cl_cold_drink IMPLEMENTATION.METHOD if_item~packing.ro_packing = NEW cl_bottle( ).ENDMETHOD.METHOD if_item~name.ENDMETHOD.METHOD if_item~price.ENDMETHOD.
ENDCLASS.
  1. 创建扩展了 CL_Pizza 和 cl_Cold_Drink 的实体类。
CLASS cl_veg_pizza DEFINITION INHERITING FROM cl_pizza.PUBLIC SECTION.METHODS if_item~name REDEFINITION.METHODS if_item~price REDEFINITION.
ENDCLASS.CLASS cl_veg_pizza IMPLEMENTATION.METHOD if_item~name.rv_name = 'Veg Pizza'.ENDMETHOD.METHOD if_item~price.rv_price = 11.ENDMETHOD.
ENDCLASS.CLASS cl_cheese_pizza DEFINITION INHERITING FROM cl_pizza.PUBLIC SECTION.METHODS if_item~name REDEFINITION.METHODS if_item~price REDEFINITION.
ENDCLASS.CLASS cl_cheese_pizza IMPLEMENTATION.METHOD if_item~name.rv_name = 'Cheese Pizza'.ENDMETHOD.METHOD if_item~price.rv_price = 28.ENDMETHOD.
ENDCLASS.CLASS cl_coke  DEFINITION INHERITING FROM cl_cold_drink.PUBLIC SECTION.METHODS if_item~name REDEFINITION.METHODS if_item~price REDEFINITION.
ENDCLASS.CLASS cl_coke IMPLEMENTATION.METHOD if_item~name.rv_name = 'Coke'.ENDMETHOD.METHOD if_item~price.rv_price = 3.ENDMETHOD.
ENDCLASS.CLASS cl_pepsi   DEFINITION INHERITING FROM cl_cold_drink.PUBLIC SECTION.METHODS if_item~name REDEFINITION.METHODS if_item~price REDEFINITION.
ENDCLASS.CLASS cl_pepsi  IMPLEMENTATION.METHOD if_item~name.rv_name = 'Pepsi'.ENDMETHOD.METHOD if_item~price.rv_price = 4.ENDMETHOD.
ENDCLASS.

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

CLASS cl_meal DEFINITION.PUBLIC SECTION.METHODS: add_itemIMPORTING iv_item TYPE REF TO if_item,get_priceRETURNING VALUE(rv_price) TYPE price,show_items.PRIVATE SECTION.TYPES:BEGIN OF ty_item,item TYPE REF TO if_item,END OF ty_item.DATA:gt_item TYPE TABLE OF ty_item.
ENDCLASS.CLASS cl_meal IMPLEMENTATION.METHOD: add_item.APPEND VALUE #( item = iv_item ) TO gt_item.ENDMETHOD.METHOD: get_price.LOOP AT gt_item ASSIGNING FIELD-SYMBOL(<lo_item>).DATA(lv_price) = <lo_item>-item->price( ).rv_price = lv_price + rv_price.ENDLOOP.ENDMETHOD.METHOD: show_items.LOOP AT gt_item ASSIGNING FIELD-SYMBOL(<lo_item>).WRITE:/ 'Item :', <lo_item>-item->name( ).WRITE:/ 'Packing :',<lo_item>-item->packing( )->pack( ) .WRITE:/ 'Price :',  <lo_item>-item->price( ).ENDLOOP.ENDMETHOD.
ENDCLASS.

6.创建一个 CL_Meal_Builder 类,实际的 cl_builder 类负责创建 cl_Meal 对象。

CLASS cl_meal_builder DEFINITION.PUBLIC SECTION.METHODS:prepare_veg_mealRETURNING VALUE(ro_meal) TYPE REF TO  cl_meal.METHODS:prepare_cheese_mealRETURNING VALUE(ro_meal) TYPE REF TO  cl_meal.
ENDCLASS.CLASS cl_meal_builder IMPLEMENTATION.METHOD prepare_veg_meal.ro_meal = NEW cl_meal( ).ro_meal->add_item( NEW cl_veg_pizza( ) ).ro_meal->add_item( NEW cl_coke( ) ).ENDMETHOD.METHOD prepare_cheese_meal.ro_meal = NEW cl_meal( ).ro_meal->add_item( NEW cl_cheese_pizza( ) ).ro_meal->add_item( NEW cl_pepsi( ) ).ENDMETHOD.
ENDCLASS.

7.cl_application 使用 cl_Meal_Builder 来演示建造者模式(Builder Pattern)。

CLASS cl_application DEFINITION.PUBLIC SECTION.CLASS-METHODS:  run .
ENDCLASS.CLASS cl_application IMPLEMENTATION.METHOD run.DATA(lo_meal_builder) = NEW cl_meal_builder( ).DATA(lo_veg_meal) = lo_meal_builder->prepare_veg_meal( ).WRITE:/ '--------------------------'.WRITE:/ '>>>Veg Meal'.WRITE:/ '--------------------------'.lo_veg_meal->show_items( ).WRITE:/ 'Total Cost: ', lo_veg_meal->get_price( ).DATA(lo_chees_meal) = lo_meal_builder->prepare_cheese_meal( ).WRITE:/ '--------------------------'.WRITE:/ '>>>Cheese Meal' .WRITE:/ '--------------------------'.lo_chees_meal->show_items( ).WRITE:/ 'Total Cost: ', lo_chees_meal->get_price( ).ENDMETHOD.
ENDCLASS.START-OF-SELECTION.cl_application=>run(  ).

8.执行程序,输出结果:

ABAP面向对象之建造者模式(Builder Pattern)相关推荐

  1. Net设计模式实例之建造者模式(Builder Pattern)(2)

    四.案例分析(Example) 1.场景 假设房子只有房顶和墙(Roof And Walls)<?XML:NAMESPACE PREFIX = O /> Jane和 Joe两个客户需要从建 ...

  2. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

  3. 大厦设计师 -- 建造者模式 (Builder Pattern) 介绍 使用案例场景分析 优缺点 及代码演示

    一句话概括: 使用多个简单对象一步一步构建成复杂对象,将复杂对象的构建与表示相分离. 补充介绍: 建造者模式(Builder Pattern)中有一个 Builder 类,这个类会一步一步构造最终的对 ...

  4. 设计模式(创建型)之建造者模式(Builder Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  5. UE4 C++设计模式:建造者模式(Builder Pattern)

    目录 描述 套路 使用场景 优缺点 UE4实践 具体复杂产品-门派角色 抽象建造者-角色构造器 具体建造者-纯阳角色构造器 具体建造者-七秀角色构造器 创建指挥者(Director)-角色创建指挥器 ...

  6. 说说设计模式~建造者模式(Builder)

    建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...

  7. 建造者模式(Builder)——从组装电脑开始

    建造者模式(Builder)--从组装电脑开始 建造者模式概括起来就是将不同独立的组件按照一定的条件组合起来构成一个相对业务完整的对象.调用者无需知道构造的过程. 我们从组装电脑开始 让我们从买组装电 ...

  8. Android设计模式之建造者模式builder

    今天小编来说一下Android中的一种设计模式--建造者模式Builder 绪论: 那么对于Android初级来说,Builder设计模式可能在我们开发中用过的很少,但是我们可能见过,我们经常用的Al ...

  9. Activiti源码之建造者模式 Builder

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

最新文章

  1. get传递中文产生乱码的解决方式汇总
  2. GDI+ 学习记录(27): Bitmap
  3. 中引入文件报错_关于前端开发中的模块化
  4. mybatis_SQL映射(1)
  5. c++ 取两个链表的交集_使用C ++程序查找两个链表的交集
  6. javacript 验证函数
  7. [渝粤教育] 广东-国家-开放大学21秋期末考试大学英语210262k2
  8. Laravel Pipeline解读
  9. VS中Release模式下生成去掉生成pdb文件
  10. 手机麦克风结构原理图_做一个最会搞气氛的人,唱吧小巨蛋麦克风G2评测:明星同款...
  11. 用python来开发webgame服务端(5)
  12. win10关闭自动更新
  13. 八泉峡明星旅游目的地系列推介会即将举行 蒋大为将现身助阵
  14. QT5.9用自定义字体修改qlabel字体、大小以及颜色
  15. ocx 加载 页面卡死
  16. 关于MSP430 FET-430UIF仿真器
  17. html超链接字体样式(鼠标点击)
  18. cap流程图_工艺流程图(中英文标准模板)
  19. 用WPF窗体打造个性化界面的图片浏览器
  20. 全新版!江西南昌首家希尔顿花园酒店开业

热门文章

  1. 裁剪图片,拼接的时候中间出现白线
  2. plt.scatter legend
  3. dw如何运行.php文件,dw怎么运行php程序?
  4. MobaXterm文档手册
  5. iterm2连接远程服务器
  6. TX Text Control 30.0
  7. N56背光键盘排线断裂修复
  8. 数据库系统丨数据库常用恢复技术
  9. Twitter实现每秒处理3000张图片的优化实践
  10. HTML5期末大作业:海贼王网站设计——代码质量好-海贼王(6页) 学生漫画网页设计模板代码 漫画网页制作模板 学生简单动漫网站设计成品