Java常用设计模式————建造者模式
引言
建造者模式(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常用设计模式————建造者模式相关推荐
- Java常用设计模式————原型模式(一)
介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...
- Java常用设计模式————工厂模式
简介: 工厂模式(Factory Pattern)是Java中最常用的设计模式之一,又称多态工厂模式.虚拟构造器模式.属于创建型模式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通 ...
- Java常用设计模式————组合模式
引言 组合模式,是一种类似递归算法的结构性设计模式,通过以简单的 List ,组合本类对象,实现树状对象结构的"部分.整体"的层次. 它可以让调用程序不需要关心复杂对象与简单对象的 ...
- Java常用设计模式-策略模式
策略模式是一个非常实用的设计模式,指定义了一类算法并将其封装起来,并使得它们之间可以灵活地切换,并且不影响客户端. 1,从一个例子开始 我们常常会在网上买东西,很多购物平台都会有着各种各样的优惠策略供 ...
- Java 常用设计模式 -- Builder模式
Builder模式是在Java中最流行的模式之一.它很简单,有助于保持对象不可变,并且可以使用Project Lombok的@Builder或Immutables等工具生成,仅举几例. 模式的流畅变体 ...
- Java常用设计模式————桥接模式
引言 在实际的业务中,经常会遇到多维度的概念组合,公园的门票,颐和园有年票.月票.日票,故宫也有年票.月票.日票.那么不同的公园和票种类型就可以视为两种不同的纬度,它们之间会形成相互组合的关系. 在类 ...
- Java常用设计模式————外观模式
引言 外观模式(Facade Pattern),又叫"过程模式".外观模式为子系统中的一组接口提供一个一致的入口,此模式定义了一个高层接口,这个接口使得这一组子系统更加易用. 一. ...
- Java常用设计模式————原型模式(二)之深拷贝与浅拷贝
引言 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言 ...
- 初学Java常用设计模式之——原型模式
声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...
最新文章
- 计算机视觉以及它在商业中是如何应用的?
- 收藏几个有意思的SQL脚本
- 团队行为心理学读书笔记(2)招聘背后的心理学
- Python+OpenCV:图像去噪(Image Denoising)
- 根据class显示或隐藏多个div
- java jtree怎么初始化,java – 如何设置JTree“ctrl”选择模式始终启用
- android rfid 数据解析_基于RFID技术的标签数据完整性与安全性解析
- android studio 模拟器文件管理器
- 五.爬虫--京东登录破解(一)
- Linux检测ip变动
- 美国农业初创公司Gotham Greens获2900万美元融资:用大数据运营温室
- 经验模式分解(EMD)——简介及Matlab工具箱安装
- 从微软官网下载原版Windows10
- 计算机专业处理器和显卡,45.显卡篇-处理器显卡和独立显卡哪个好-电脑自学网...
- 英语语法第四节(主宾表从句)
- window的onload事件的用法
- 2021年全球与中国关节镜行业市场规模及发展前景分析
- 别急着撤离北京,这里有最好的机会
- 大数据分析师年薪有多少,学什么专业才能从事大数据?
- 如何根据银行卡号获取对应的银行编号,如:ICBC
热门文章
- c语言中memcpy函数_带有示例的C中的memcpy()函数
- ai逻辑回归_人工智能中的逻辑是什么?
- java中intvalue_Java Float类intValue()方法与示例
- 软件测试 测试策略_测试策略| 软件工程
- 使用uuid作为数据库主键,被技术总监怼了!
- 第 6-1 课:Spring 核心 + 面试题
- Java新特性:数据类型可以扔掉了?
- 面试干货 | Java 能否自定义一个类叫 java.lang.System?
- Listener refused the connection with the following error 错误解决(最大连接数)
- 关于make_work_guard猜想