设计模式_3_建造者模式

建造者模式(BuilderPattern)

内在的核心问题就是: 使用多个简单对象根据一种组合关系构造一个我们想要的复杂对象, 属于创建型模式

  • 建造者模式的角色关系
    建造者模式中总共有两种角色:
1.建造者: 负责建造每个基本组件
2.指挥者: 将建造者建造好的基本组件按照某种组合关系进行拼装
  • 使用方式:
    建造者模式具有两部分组成: 基本组件( 维持在稳定状态,不会轻易变化 ), 基本组件之间的组合关系( 组合关系总是多变的 );
1.先将每个简单的组件类构建出来.
2.指挥者按照特定的建造顺序调用组件类对象举个例子: 比如电脑的组装, 组装顺序是固定的, 但是组装的零件是可变的
3.在测试类中通过指挥者对象选用需要的基本组件, 构造复杂对象

优点: 基本组件独立,易扩展; 便于控制细节风险
缺点: 构建出来的复杂对象必须有公共点, 构建的范围有限制; 生成对象之间具有一定的依赖关系

注: 建造者模式与工厂模式的区别-----建造者更关注零件的装配顺序, 将一个复杂的构建过程与其表示相分离, 并不是由建造者负责一切, 而是由指挥者负责控制(定义)一个复杂的构建过程, 由各个不同的建造者分别实现构建过程所用到的构建步骤

  • 下面通过一个例子说明:
    基本组件: 汉堡, 冷饮, 纸盒, 瓶子
package com.BuilderPattern;
import java.util.ArrayList;
import java.util.List;/*** 快餐店案例, 套餐为汉堡,冷饮,包装有纸盒,瓶子* @author regotto**/
public class BuilderPattern {//测试类public static void main(String[] args) {MealBuilder mb=new MealBuilder();//测试类中负责需要的点餐内容Meal vegMeal=mb.prepareVegMeal(new VegBurger(), new Pepsi());vegMeal.showItems();System.out.println("Cost: "+vegMeal.getCost());}
}//针对所有基本组件的接口: 名字,包装形式, 价格
interface Item{String name();Packing packing();double price();
}//指挥者: 搭配一次点餐内容
class MealBuilder{//搭配方式是固定的, 汉堡+冷饮public Meal prepareVegMeal(Burger b, ColdDrink cd) {Meal meal=new Meal();meal.addItem(b);meal.addItem(cd);return meal;}
}//一次点餐包含的基本组件(使用ArrayList存储)
class Meal{private List<Item> items=new ArrayList<Item>();public void addItem(Item item) {items.add(item);}public double getCost() {double cost=0.0;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());}}
}
//基本组件包装的接口: 包装,包含纸盒,瓶子
interface Packing{public String pack();
}//包装的实现类, 汉堡使用纸盒, 冷饮使用瓶子
class Wrapper implements Packing{public String pack() {return "Wrapper";}
}
class Bottle implements Packing{public String pack() {return "Bollte";}
}//抽象的汉堡组件
abstract class Burger implements Item{public Packing packing() {return new Wrapper();}
}
//汉堡组件的实现类
class VegBurger extends Burger{public String name() {return "VegBurger";}public double price() {return 10.5;}
}
class ChickenBurger extends Burger{public String name() {return "ChickenBurger";}public double price() {return 15.5;}
}//抽象冷饮的基本组件
abstract class ColdDrink implements Item{public Packing packing() {return new Bottle();}
}
//冷饮的实现类
class Pepsi extends ColdDrink{public String name() {return "Pepsi";}public double price() {return 3.50;}
}
class Coke extends ColdDrink{public String name() {return "Coke";}public double price() {return 5.50;}
}

上面有错, 还请指出, 如果认为我写的还不错, 还请点个赞, 多多支持一下, O(∩_∩)O~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

比较两个表格的不同_两表数据的核对,WPS表格似乎更加方便容易

在EXCEL中的两个表格的数据对比&#xff0c;可能使用的方法会采用到查询语句&#xff0c;VBA之类的。显得在使用的过程显得有些复杂。在不经间发现WPS表格的功能处理此类的问题显得就比较的简单的多。查看并标识出分数相同的内容如下面的分数表&#xff0c;选择分数栏的范围&am…

6递归

1 /*2 递归函数:3 函数自己调用自己就叫递归函数4 递归可以实现循环5 递归是神,迭代是人(迭代循环)6 缺点:需要暂存大量的数据,递归次数太多会占用大量内存空间7 8 递归和迭代的区别9 迭代是循环结构 10 递归是选择结…

我的知识小密圈

写在前面从不久之前到现在&#xff0c;我的微信公众号从一个小小小阶段到了另一个小小阶段&#xff0c;非常感谢各位读者对我的信任和支持&#xff0c;当然我也是非常用心的维护这这群朋友&#xff0c;时刻想着怎样给大家做好服务 &#xff0c;比如我正在溜娃&#xff0c;隔断时…

设计模式_4_原型模式(对象的拷贝)

原形模式(PrototypePattern, 创建型模式,创建重复对象且保证性能, 对象的克隆) 通常使用原型模式创建一个原型接口, 用于获取创建对象的克隆, 对于浅拷贝与深拷贝不用纠结, 他们二者的区别就在于重写Clonable的clone方法 浅拷贝与深拷贝 浅拷贝: 直接调用Object的clone pub…

vk_down 每次下翻丙行 c++_笔记本接口不够用?不妨试试这款Type-C拓展坞,给你7个接口用...

随着笔记本电脑越来越轻薄化&#xff0c;已经很难再布局较多的数据接口了&#xff0c;但是在办公等环境下总是需要这些接口来满足需求。就拿小新个人来说&#xff0c;使用的是小米笔记本12.5寸款的&#xff0c;该款笔记本仅有三个接口&#xff0c;分别是全功能 USB-C 接口 x 1、…

学习,才是最好的投资~

推荐语&#xff1a;我因为王小波常说而喜欢的英国哲学家罗素的一句话&#xff1a; 参差多态乃是幸福的本源。正是因为有了多种多样的行业&#xff0c;才使得我们的职业也是多种多样&#xff0c;行行出大牛&#xff01;这个世界天生就注定有人搞互联网的&#xff0c;Linux&#…

第二百四十八节,Bootstrap轮播插件

Bootstrap轮播插件 学习要点&#xff1a; 1.轮播插件 本节课我们主要学习一下 Bootstrap 中的轮播插件。 一&#xff0e;轮播 轮播插件就是将几张同等大小的大图&#xff0c;按照顺序依次播放。 基本实例。 第一步&#xff0c;给轮播器区域div设置一个id给轮播器区域div设置样…

设计模式_4_适配器模式(AdapterPattern, 多个功能的结合)

适配器模式(AdapterPattern, 结构型模式) 用最通俗的讲法就是: 将多个功能相关或不相关的接口( 你需要的接口 )放到同一个实现类里, 构造一个具有多工功能, 多特点的"异类对象" 定义 是作为多个接口之间的桥梁,结合多个独立的接口(将多个类/功能结合在一起,构建出一…

xgboost分类_XGBoost(Extreme Gradient Boosting)

一、XGBoost在Ensemble Learning中的位置机器学习中&#xff0c;有一类算法叫集成学习&#xff08;Ensemble Learning&#xff09;&#xff0c;所谓集成学习&#xff0c;指将多个分类器的预测结果集成起来&#xff0c;作为最终预测结果&#xff0c;它要求每个分类器具备一定的“…

Android技术架构演进与未来

本文阅读大约需15分钟 引言众所周知&#xff0c;Android是谷歌开发的一款基于Linux的开源操作系统&#xff0c;每年迭代一次大版本升级。 小米、华为、OPPO、VIVO、三星等各大厂商对Android原生系统进行二次开发衍生出具有各家特色的系统&#xff08;比如MIUI&#xff09;&…

Sublime Text 3插件安装方法

一&#xff1a;安装Sublime Text 3插件的方法安装package control组件&#xff0c;然后直接在线安装&#xff1a;1、按Ctrl调出console&#xff08;注&#xff1a;安装有QQ输入法的这个快捷键会有冲突的。输入法属性设置-输入法管理-取消热键切换至QQ拼音&#xff09; 2、粘贴下…

Hibernate_1_配置文件详解_基础案例_Hibernate工具类_API详解_持久化类编写规则

Hibernate( ORM框架 ) Hibernate是一个数据持久化层的ORM框架. 它通过JavaBean, 数据库中的表与自身的映射关系达到表中数据的增删改查 特性 1.对JDBC访问数据库的代码进行封装, 简化数据访问的重复性代码 2.使用反射机制完成对Bean的封装 3.轻量级框架,支持关系型数据库 核…

建筑电气工程设计常用图形和文字符号_建筑水电图纸看不懂?10年老师傅教你看图技巧,分分钟安排...

1、建筑给排水工程包括&#xff1a;给水、排水、热水、消火栓、自动喷淋等常用系统&#xff0c;其管道当中流动的是水。(其管道输送介质为水)2、给排水系统的主要功能&#xff1a;(1)建筑给水系统的任务&#xff0c;就是经济合理地将水由室外给水管网输送到装置在室内的各种配水…

Android系统架构开篇

Android系统庞大且错综复杂&#xff0c;Gityuan带领大家初探Android系统整体架构&#xff0c;一窥其全貌。一、引言本文作为Android系统架构的开篇&#xff0c;起到提纲挈领的作用&#xff0c;从系统整体架构角度概要讲解Android系统的核心技术点&#xff0c;带领大家初探Andro…

20155220 实验三 敏捷开发与XP实践 实验报告

20155220 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础XP核心实践相关工具实验要求 没有Linux基础的同学建议先学习《Linux基础入门&#xff08;新版&#xff09;》《Vim编辑器》 课程完成实验、撰写实验报告&#xff0c;实验报告以博客方式发表在博客园&#xff0c;注意…

Hibernate_2_Hibernate中对象状态及转化_一级缓存_Session详解_HQL/SQL/Criteria_一对多关系_级联操作

Hibernate中的对象状态 在Hibernate中持久化对象具有三种状态: 瞬时态, 持久态, 游离态. 瞬时态: 对象没有与Hibernate产生关联(transient,session中没有缓存), 数据库中也没有对应记录> 对象无id, 没有关联 持久态: 对象与Hibernate产生关联(persistent, session中有缓存…

python正则表达式操作指南_第二篇详细Python正则表达式操作指南(re使用)

接下来昨天的内容执行匹配一旦你有了已经编译了的正则表达式的对象&#xff0c;你要用它做什么呢&#xff1f;RegexObject 实例有一些方法和属性。这里只显示了最重要的几个&#xff0c;如果要看完整的列表请查阅 Python Library Reference如果没有匹配到的话&#xff0c;match…

Android binder 框架和学习资料

&#xff11;Android binder 是学习 Android 系统一定要啃得硬骨头&#xff0c;可能你刚开始的时候并不理解其中的精髓&#xff0c;但是在 android 系统的很多地方你都会遇到它。不过要我自己写明白其中的逻辑脉络需要花费太多的时间和精力&#xff0c;而且传播效果也不是非常好…

Spring_Bean配置_生命周期_注解

Spring Spring是一个开源框架&#xff0c;Spring是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之…

完全理解Gson(1):简单入门

GSON是Google开发的Java API&#xff0c;用于转换Java对象和Json对象。本文讨论并提供了使用API的简单代码示例。更多关于GSON的API可以访问&#xff1a;http://sites.google.com/site/gson/. 本文是GSON系列文章的第一篇。本文是其他文章的基础&#xff0c;因此不需要任何GSON…