没有合适的资源?快使用搜索试试~ 我知道了~
软件系统设计-设计模式 - 具体设计模式1
需积分: 0 0 下载量 197 浏览量
2022-08-03
16:10:11
上传
评论
收藏 671KB PDF 举报
温馨提示
试读
5页
1. 许多相关类仅在行为上有所不 2. 需要算法的不同变体:定义不 3. 避免暴露复杂的、特定于算法 4. 一个类定义多种行为并显示为 1. Java 的加密方
资源详情
资源评论
资源推荐
软件系统设计 具体设计模式 By 张洪胤 未经本人同意请勿转发
模式名称
英文名/别名
模式分类
设计模式简述
设计模式角色
相关设计原则
设计模式适用场景
设计模式实例
设计模式优点
设计模式缺点
模式扩展
策略模式
Strategy Pattern
Policy Pattern
对象行为型
定义:策略模式定义了一
系列算法,将每个算法封
装在一起,并使它们可替
换,策略使得算法独立于
使用该算法的客户端而
变化(变化在客户使用时
才会出现,必须将细节暴
露给用户)
1. 许多相关类仅在行为上有所不
同:使用配置类配置
2. 需要算法的不同变体:定义不
同具体的算法
3. 避免暴露复杂的、特定于算法
的数据结构
4. 一个类定义多种行为并显示为
多个条件语句
1. Java 的加密方法
2. Java 的时间显示算法
1. 消除条件语句
2. 提供多种实现方式供客户选择
1. 客户在选择合适的策略之前必
须先了解策略的不同
2. 策略和上下文之间通信开销
3. 对象数量增加
简单工厂
模式
Simple Factory
Pattern
Static Factory
Pattern
类创建型
定义:简单工厂模式定义
一个专门的类负责创建
其他类的实例(这些类通
常都有相同的父类),可
以根据参数的不同返回
不同类的实例
1. 工厂角色:提供静态工厂方
法,接受参数(配置文件)传
入
2. 抽象产品角色(父类)
3. 具体产品角色
满 足 单 一 职 责 原
则:将对象创建和
业务逻辑使用分离
违背开闭原则:对
开闭原则支持不好
1. 工厂类负责创建的对象比较少
(不会导致判断逻辑太复杂)
2. 客户端只需要知道传入工厂的
参数,对于如何创建对象不关
心
1. 权限管理
2. Java 的 DateFormat
3. Java 的加密技术(对称非对
称加密)
1. 实现了责任切割,提供专门的工厂
类用于创建对象
2. 客户端无需知道所处构建的具体
产品类类名,而只需要知道参数,
减少记忆量
3. 通过引入配置文件,可以在不修改
客户端代码的情况下更换和增加
新的具体产品类,提高灵活性
1. 工厂集中了的职责过重,增加
产品违背开闭原则(需要修改判
断逻辑代码)
2. 系统扩展困难,添加新产品就
需要修改工厂逻辑
3. 不利于系统的扩展和维护
4. 工厂角色无法形成基于集成的
等级结构。
5. 增加系统中类的个数,增加复
杂性和理解难度
简单工厂模式的简化:工厂类由抽象
产品角色对象扮演(适用于产品本身
只提供 1-2 个方法时)
工厂方法
模式
Factory Method
Pattern
虚拟构造
Virtual Constructor
多态工厂
Polymorphic Factory
类创建型
生成一类产品
定义:将产品类的实例化
操作推迟到工厂子类中
完成。
变化的部分:产品的服务
不变的部分:对象的使用
1. 工厂父类:定义创建产品对
象的公共接口
2. 工厂子类:定义生成具体的
产品对象(推迟实例化)
3. 抽象产品对象
4. 具体产品对象
符合开闭原则:允
许系统在不修改工
厂角色的情况下引
进新产品
1. 一个类不知道它所需的对象的
类(只需要知道对应工厂)
2. 一个类通过其子类来指定创建
哪个对象(结合多态性和里氏代
换原则)
3. 将创建对象的任务委托给多个
工厂子类中的某一个,客户端
使用时可以无须关心是哪一个
工厂子类创建产品子类,需要
时再动态指定(可以用配置文
件)
1. 日志记录器(文件记录、数
据库记录)
1. 用户只需要关心所需产品对应的
工厂,无须关注创建细节,甚至无
须指导具体产品的类名。
2. 工厂可以自主确定创建何种产品
对象,而如何创建这个对象的细节
完全封装在具体工厂内部。
3. 系统中加入新产品时,无须修改抽
象工厂和抽象产品提供的接口,无
须修改客户端,也无须修改具体工
厂和具体产品,只需要添加一个具
体工厂和具体产品。
1. 编写新的具体产品类时,还需
要 提 供 与 之 对 应 的 具 体 工 厂
类,导致类个数成对增加,增加
系统的复杂度和编译开销
2. 抽象层引入增加了系统的抽象
性和理解难度,且实现中会使
用到 DOM 和反射等技术,实现
难度大。
模式退化:抽象工厂和具体工厂合
并,且创建对象的工厂方法被设计为
静态方法时退化成具体简单工厂模
式
抽象工厂
模式
Abstract Factory
Pattern
Kit
模式
对象创建型
定义:生成多个位于不同
产品等级结构中属于不
同类型的具体产品。
提供一个创建一系列相
关或相互依赖对象的接
口,而无须指定他们具体
的类。
1. 抽象工厂
2. 具体工厂
3. 抽象产品
4. 具体产品
1. 一个系统不应当依赖于产品实
例如何被创建、组合和表达的
细节(适用于所有工厂)
2. 系统中有多于一个的产品族,
而每次只使用其中某一产品族
3. 属于同一个产品族的产品将在
一起使用(系统设计约束)
4. 系统提供一个产品类的库,所
有的产品以同样的接口出现,
从而使得客户端不依赖于具体
实现。
1. 电器工厂(生产电视和空调
等多个产品族)
2. 数 据 库 操 作 工 厂 ( 生成
Connection 和 Statement)
1. 隔离了具体类的生成,改变具体工
厂的实例就可以某种程度上改变
整个软件系统的行为,实现高内聚
低耦合。
2. 当产品族多个对象被设计成一起
工作时,能保证客户端只使用同一
个产品族中的对象。
3. 增加新的具体工厂和产品族很方
便,无须修改已有系统
1. 添加新的产品对象时,难以扩
展抽象工厂来生成新种类的产
品(开闭原则的倾斜性,增加新
的工厂和产品族容易,增加新
的产品等级结构麻烦)
开闭原则的倾斜性:增加新的产品族
只需要增加新的具体工厂,而增加新
的产品等级结构,则需要修改所有工
厂对象和抽象工厂。
模式退化:只存在一个产品等级结构
时,抽象工厂退化为工厂方法模式。
产品等级结构:产品等级即产品的集
成结构。比如,抽象类是电视机,子
类是海尔电视机等。
产品族:由同一个工厂生成的,位于
不同产品等级结构中的一组产品。比
如,海尔电视机在电视机的产品族中
建造者
模式
Builder Pattern
对象创建型
生成一个组装好的完整
产品。
定义:将一个复杂对象的
构建与它的表示分离,使
得同样的构建过程可以
创建不同的表示(一步一
步创建一个复杂的对象,
用户不需要知道构建的
细节,只需要指定复杂对
象的类型和内容即可)
变化的部分:产品的细节
不变的部分:建造的过程
1. 抽象建造者:为创建一个产
品对象的各个部件指定抽
象接口。
2. 具体建造者:实现抽象创建
早接口,实现每个部件的构
造和装配方法,定义并明确
它所创建的复杂对象,也可
以提供一个方法返回创建
好的复杂产品对象。
3. 指挥者:隔离客户与生成的
过程;负责控制产品的生成
流程( 针对抽 象建 造 者 编
程,客户只需要知道具体建
造者的类型)
4. 产品角色:被构建复杂对象
1. 产品对象具有复杂的内部结构
(包含多个成员属性)
2. 产品对象属性相互依赖,需要
执行生成顺序
3. 产品创建过程独立于创建对象
的类。(引入指挥者类,对创建
过程进行封装)
4. 隔离复杂对象的创建和使用,
并使得相同的创建过程可以创
建不同的产品。
1. KFC 套餐
2. Java Mail
3. 地图和任务
1. 客户端不必知道产品内部组成的
细节,将产品本身与产品的创建过
程解耦,使得相同的创建过程可以
创建不同的对象。
2. 每个建造者相对独立,用户使用不
同的具体建造者即可得到不同的
产品对象。
3. 可以跟家精细地控制产品的创建
过程(步骤分解)
4. 增加新的具体建造者无须修改原
有类库的代码,指挥者类针对抽象
建造者编程,系统扩展方便,符合
开闭原则
1. 要求创建的产品具有较多的相
同点,其组成部分相似,使用范
围受限。
2. 如果产品内部变化复杂,则需
要很多的具体建造者,导致系
统庞大
省略抽象建造者角色:系统内只需要
一个具体建造者。
省略指挥家角色:如果抽象建造者已
经被省略,那么可以让具体建造者同
时扮演指挥家和建造者。
与抽象工厂模式的区别:更侧重于创
建一个完整的对象,并且可以通过指
挥者类来完成创建。可以将抽象工厂
模式比作汽车配件生产工厂,创建者
模式是汽车组装工厂。
原型模式
Prototype Pattern
对象创建型
定义:用原型实例指定创
建对象的种类,并且通过
复制这些原型创建新的
对象。(无须知道任何创
建的细节)
基本原理是通过将一个
原型对象传给要发动创
建的对象,要发动创建的
对象通过请求原型对象
拷贝自己来实现创建过
程。
1. 抽象原型类:具有克隆自己
的方法的接口。
2. 具体原型类:实现具体得到
克隆方法,返回自己的克隆
对象。
3. 客户类:直接实例化或通过
工厂方法创建一个对象后,
就可以通过克隆方法进行
复制。
违反开闭原则:需
要编写修改克隆方
法。
1. 创建新对象的成本较大。使用
复制可以降低成本。
2. 如 果 系 统 需 要 保 存 对 象 状 态
时,如果对象状态变化小或占
用内存较少,可以使用原型模
式配合备忘录模式。如果对象
状态变化较大,则使用状态模
式。
3. 需要通过避免使用分层次的工
厂类来创建分层次的对象,且
类的实例只有一个或较少状态
时,使用复制比使用构造更好。
1. Java Object 的 clone 方法(需
要实现接口 Cloneable)复制
一份对象并返回(满足克隆
对象和原对象不是同一个
对象,类型相同)
2. 邮件复制(浅克隆,不复制
附件)
3. 软件中的 Ctrl+C、Ctrl+V
4. Strut2 中为保证线程安全
性,创建 Action,避免其中
定义的变量加锁进行同步。
5. Spring 中原型模式创造新
的 Bean 后对其进行修改
(不影响原实例)
1. 原型模式可以快速创建很多相同
或相似的对象,简化对象的创建过
程(对于复杂对象),提供了简化的
创建结构
2. 可以动态增加或减少产品类
3. 可以使用深克隆保存对象的状态
1. 每个类都需要提供克隆方法,
必须修改类的源代码,违反开
闭原则
2. 实现深克隆时需要编写较为复
杂的代码
原型模式分类:深克隆(递归拷贝成员
变量)和浅克隆
带原型管理器的原型模式
(PrototypeManager)
weixin_35780426
- 粉丝: 19
- 资源: 286
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- wenku_33bda3697f1cfad6195f312b3169a4517723e5a5_1716730762957.mp4
- YOLOv8井盖检测模型
- Python OCR 文字检测使用模型:读光-文字检测-DBNet行检测模型-中英-通用领域
- 磁盘直读直写、文件分配表读写、文件恢复(反删除)、文件强制删除、文件锁、文件超级隐藏等
- 基于Java的心理咨询平台设计源码
- win-patch-backend+update-v7.11.0.zip
- miniforge3-linux-aarch4.sh
- testtest1111
- 超实用的多功能工具箱小程序源码+支持流量主变现
- 基于 Yolov5 和 3DDeepbox 执行 3D 目标检测
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0