引言

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

一个Builder会一步步构建最终的对象。该Builder类是独立于其他对象的。

实现概要

建造者模式的实现并没有一个特别经典的套路,原因是在多数情况下复杂对象的构建往往千奇百怪。但为了更好的理解建造者模式使用的场景,我们假设如下的功能需要:

因为建造者模式就是为了构建复杂对象,为了更加贴近这一点,以午餐(Meal)作为最终要被构建的对象,我们假设:午餐中分为食物(Item)包装(Packing)—>食物包含汉堡(Burger)冷饮(ColdDrink)两种;汉堡鸡肉汉堡(ChickenBurger)蔬菜汉堡(VegBurger)之分;冷饮可口可乐(Coke)百事可乐(Pepsi)之分;包装又分为瓶装(Bottle)袋装(Wrapper)两种。

如果你看不懂上面的描述,或者已经准备关闭浏览器去做眼睛保健操,那么下面的结构图可能对你有所帮助:

实现过程

一、创建基础接口

创建食物接口及具体实现类,创建包装接口及具体包装类:

public interface Item {/** 食物名称*/String name();/** 包装*/Packing packing();/** 总价*/float price();
}
public abstract class Burger implements Item {@Overridepublic Packing packing() {return new Wrapper();}
}
public class ChickenBurger extends Burger {@Overridepublic String name() {return "Chicken Burger";}@Overridepublic float price() {return 50.5f;}
}
public class VegBurger extends Burger {@Overridepublic String name() {return "Veg Burger";}@Overridepublic float price() {return 25.0f;}
}
public abstract class ColdDrink implements Item {@Overridepublic Packing packing() {return new Bottle();}
}
public class Coke extends ColdDrink {@Overridepublic String name() {return "Coke";}@Overridepublic float price() {return 30.0f;}
}
public class Pepsi extends ColdDrink {@Overridepublic String name() {return "Pepsi";}@Overridepublic float price() {return 35.0f;}
}
public interface Packing {String pack();
}
public class Bottle implements Packing {@Overridepublic String pack() {return "Bottle";}
}
public class Wrapper implements Packing {@Overridepublic String pack() {return "Wrapper";}
}

二、创建目标类型

此例中,目标类型即午餐类(Meal)

public class Meal {private List<Item> items = new ArrayList<Item>();public Meal addAll(List<? extends Item> items) {this.items.addAll(items);return this;}public Double getSum() {return this.items.stream().collect(Collectors.summarizingDouble(Item::price)).getSum();}public Double getAverage() {return this.items.stream().collect(Collectors.summarizingDouble(Item::price)).getAverage();}public void showItems() {this.items.forEach(item -> {System.out.print("Item : " + item.name());System.out.print(", Packing : " + item.packing().pack());System.out.println(", Price : " + item.price());});}
}

三、创建建造者类

public class MealBuilder {public Meal prepareMeal(Item... items) {return new Meal().addAll(Arrays.asList(items));}
}

四、测试

public class BuilderPatternDemo {public static void main(String[] args) {MealBuilder mealBuilder = new MealBuilder();Meal vegMeal = mealBuilder.prepareMeal(new VegBurger(), new Coke());System.out.println("Veg Meal");vegMeal.showItems();System.out.println("Total Cost: " + vegMeal.getSum());Meal nonVegMeal = mealBuilder.prepareMeal(new ChickenBurger(), new Pepsi());System.out.println("\n\nNon-Veg Meal");nonVegMeal.showItems();System.out.println("Total Cost: " + nonVegMeal.getSum());}
}

执行结果:

总结

意图:建造者模式的用意就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示,例如本例中相同的创建午餐的方式,但使用不同的基础对象,最终得出不一样的套餐。

使用场景:一些基础部件不会变,而其组合经常变化的时候。主要解决软件系统中,有时候会面临“一个复杂对象”的创建工作,其通常由多个子对象用一定的算法构成。由于需求的变化,这个复杂对象的各个部件经常面临着剧烈的变化,但将它们组合在一起的算法相对稳定。

优点:建造者独立,易扩展;便于控制细节风险。

缺点:产品必须有共同点,范围有限制;内部变化复杂,会有很多建造类。

鸣谢

《建造者模式》

Java常用设计模式————建造者模式相关推荐

  1. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

  2. Java常用设计模式————工厂模式

    简介: 工厂模式(Factory Pattern)是Java中最常用的设计模式之一,又称多态工厂模式.虚拟构造器模式.属于创建型模式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通 ...

  3. Java常用设计模式————组合模式

    引言 组合模式,是一种类似递归算法的结构性设计模式,通过以简单的 List ,组合本类对象,实现树状对象结构的"部分.整体"的层次. 它可以让调用程序不需要关心复杂对象与简单对象的 ...

  4. Java常用设计模式-策略模式

    策略模式是一个非常实用的设计模式,指定义了一类算法并将其封装起来,并使得它们之间可以灵活地切换,并且不影响客户端. 1,从一个例子开始 我们常常会在网上买东西,很多购物平台都会有着各种各样的优惠策略供 ...

  5. Java 常用设计模式 -- Builder模式

    Builder模式是在Java中最流行的模式之一.它很简单,有助于保持对象不可变,并且可以使用Project Lombok的@Builder或Immutables等工具生成,仅举几例. 模式的流畅变体 ...

  6. Java常用设计模式————桥接模式

    引言 在实际的业务中,经常会遇到多维度的概念组合,公园的门票,颐和园有年票.月票.日票,故宫也有年票.月票.日票.那么不同的公园和票种类型就可以视为两种不同的纬度,它们之间会形成相互组合的关系. 在类 ...

  7. Java常用设计模式————外观模式

    引言 外观模式(Facade Pattern),又叫"过程模式".外观模式为子系统中的一组接口提供一个一致的入口,此模式定义了一个高层接口,这个接口使得这一组子系统更加易用. 一. ...

  8. Java常用设计模式————原型模式(二)之深拷贝与浅拷贝

    引言 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言 ...

  9. 初学Java常用设计模式之——原型模式

    声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...

最新文章

  1. 计算机视觉以及它在商业中是如何应用的?
  2. 收藏几个有意思的SQL脚本
  3. 团队行为心理学读书笔记(2)招聘背后的心理学
  4. Python+OpenCV:图像去噪(Image Denoising)
  5. 根据class显示或隐藏多个div
  6. java jtree怎么初始化,java – 如何设置JTree“ctrl”选择模式始终启用
  7. android rfid 数据解析_基于RFID技术的标签数据完整性与安全性解析
  8. android studio 模拟器文件管理器
  9. 五.爬虫--京东登录破解(一)
  10. Linux检测ip变动
  11. 美国农业初创公司Gotham Greens获2900万美元融资:用大数据运营温室
  12. 经验模式分解(EMD)——简介及Matlab工具箱安装
  13. 从微软官网下载原版Windows10
  14. 计算机专业处理器和显卡,45.显卡篇-处理器显卡和独立显卡哪个好-电脑自学网...
  15. 英语语法第四节(主宾表从句)
  16. window的onload事件的用法
  17. 2021年全球与中国关节镜行业市场规模及发展前景分析
  18. 别急着撤离北京,这里有最好的机会
  19. 大数据分析师年薪有多少,学什么专业才能从事大数据?
  20. 如何根据银行卡号获取对应的银行编号,如:ICBC

热门文章

  1. c语言中memcpy函数_带有示例的C中的memcpy()函数
  2. ai逻辑回归_人工智能中的逻辑是什么?
  3. java中intvalue_Java Float类intValue()方法与示例
  4. 软件测试 测试策略_测试策略| 软件工程
  5. 使用uuid作为数据库主键,被技术总监怼了!
  6. 第 6-1 课:Spring 核心 + 面试题
  7. Java新特性:数据类型可以扔掉了?
  8. 面试干货 | Java 能否自定义一个类叫 java.lang.System?
  9. Listener refused the connection with the following error 错误解决(最大连接数)
  10. 关于make_work_guard猜想