【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★(二)

简介: 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★(二)

3、建造者模式


【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )



建造者模式 : 将 一个复杂对象 的 构建过程 与其 表示 分离 , 使得 同样的构建过程 , 可以 创建不同的表示 ;


用户只需要 指定 需要建造的类型 就可以 得到该类型对应的产品实例 , 不关心建造过程细节 ;


建造者模式就是 如何逐步构建包含多个组件的对象 , 相同的构建过程 , 可以创建不同的产品 ,



建造者模式类型 : 创建型 ;



建造者模式适用场景 :


结构复杂 : 对象 有 非常复杂的内部结构 , 有很多属性 ;

分离创建和使用 : 想把 复杂对象 的 创建 和 使用 分离 ;

当创造一个对象 需要很多步骤时 , 适合使用建造者模式 ;

当创造一个对象 只需要一个简单的方法就可以完成 , 适合使用工厂模式 ;



建造者模式优点 :


封装性好 : 创建 和 使用 分离 ;

扩展性好 : 建造类之间 相互独立 , 在 一定程度上解耦 ;


建造者模式缺点 :


增加类数量 : 产生多余的 Builder 对象 ;

内部修改困难 : 如果 产品内部发生变化 , 建造者也要相应修改 ;


建造者模式 与 工厂模式 :


注重点不同 : 建造者模式 更注重于 方法的调用顺序 ; 工厂模式 注重于 创建产品 , 不关心方法调用的顺序 ;

创建对象力度不同 : 创建对象的力度不同 , 建造者模式可以创建复杂的产品 , 由各种复杂的部件组成 , 工厂模式创建出来的都是相同的实例对象 ,


4、单例模式



5、原型模式


【设计模式】原型模式 ( 概念简介 | 使用场景 | 优缺点 | 基本用法 )

【设计模式】原型模式 ( 浅拷贝 | 深拷贝 | 原型与单例冲突 | 禁用 final )



原型模式 : 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象



① 设计模式类型 : 创建型设计模式 ;


② 原型实例对象 : 给出原型实例对象 , 根据该对象创建新对象 ;


③ 创建对象类型 : 创建对象的种类由原型的实例对象类型确定 ;


④ 创建方式 : 不调用构造函数 , 而是通过克隆原型的实例对象 , 使用现有对象创建另一个相同类型的对象 , 隐藏创建细节 ;



原型模式使用场景 : 原型模式的目的是 降低实例对象个数 , 减少构造函数的调用次数 ;



① 类初始化消耗资源过多 : 如果类初始化时消耗过多的资源 , 如这个类中某个成员占用大量内存 , 为了节省开销 ;


② 初始化繁琐耗时 : 类对象创建时经过大量的计算 , 或与本地资源 ( 数据库 , 文件 ) 频繁交互 , 每次创建消耗大量的 CPU 与 时间资源 ;


③ 构造函数复杂 : 类中定义的构造函数复杂 ;


④ 实例对象数量庞大 : 如果在内存中循环创建了很多该实例对象 , 就可以使用原型模式复用不用的对象 , 用于创建新对象 ;



1 . 原型模式优点 : 性能高 , 简单 ;



① 性能高 : 使用原型模式复用的方式创建实例对象 , 比使用构造函数重新创建对象性能要高 ; ( 针对类实例对象开销大的情况 )


② 流程简单 : 原型模式可以简化创建的过程 , 可以直接修改现有的对象实例的值 , 达到复用的目的 ; ( 针对构造函数繁琐的情况 )



2 . 原型模式缺点 : 实现复杂 , 坑多 ;



① 覆盖 clone 方法 ( 必须 ) : 必须重写对象的 clone 方法 , Java 中提供了 cloneable 标识该对象可以被拷贝 , 但是必须覆盖 Object 的 clone 方法才能被拷贝 ;


② 深拷贝 与 浅拷贝 风险 : 克隆对象时进行的一些修改 , 容易出错 ; 需要灵活运用深拷贝与浅拷贝操作 ;






三、结构型模式


适配器模式 , 装饰者模式 , 代理模式 , 外观模式 , 桥接模式 , 享元模式 使用较频繁 ;


组合模式不经常使用 ;



1、适配器模式


【设计模式】适配器模式 ( 概念 | 适用场景 | 优缺点 | 外观模式对比 | 适配器模式相关角色 | 类适配器 | 对象适配器 | 实现流程 )



适配器模式 :



① 设计模式类型 : 结构型 ;


② 概念 : 将 类的接口 转换成用户可以调用的 另外一个接口 ;


③ 目的 : 使接口不兼容的两个类可以一起工作 ;


④ 概念中的三个角色 : 被适配者 ( 现有的功能类 ) , 用户目标接口 ( 用户调用的接口 ) , 适配器类 ( 用户通过调用该类 , 间接调用 被适配者类 ) ;


⑤ 简易原理 : 适配器类 实现用户目标接口 , 在该接口的实现类中调用被适配者 , 实现了接口转接的效果 ; 使用的时候 , 通过创建适配器类 , 即可间接调用被适配者方法 ;



适配器模式 适用场景 :


1 . 功能正确但接口不匹配 : 对于之前开发好的类 , 该类的操作和返回值都是正确的 , 但是其定义的方法接口无法调用 , 此时使用适配器模式 , 使该类与用户的接口匹配 , 让用户使用适配器的接口 , 间接调用该类 ;



2 . 适配器模式使用阶段 : 软件设计开发阶段一般不使用适配器模式 , 在软件维护时 , 出现操作和返回值类似 , 但是函数接口不同 , 为了适配第三方系统的接口 , 使用适配器模式 ;



设计阶段不要使用适配器模式 ;



3 . 适配器的两种实现方式 : 对象适配器模式 与 类适配器 ;



① 对象适配器 : 符合组合复用原则 , 使用了委托机制 ; ( 通过组合实现 , 适配器类中维护被适配者成员 )


② 类适配器 : 通过类的继承实现适配器模式 ; ( 通过继承实现 , 适配器类继承被适配者类 )



推荐使用对象适配器模式 , 在继承与组合二者之间 , 优先选择组合方案 ;



1 . 适配器模式 优点 :



① 复用且不修改类 : 不改变现有类的基础上 , 提高类的复用性 , 透明性 ; 让现有类与目标类接口匹配 ;


② 降低耦合 : 目标类 ( 用户调用的接口所在类 ) 和 现有类 ( 被适配者 ) 解除耦合 , 降低了系统的耦合性 , 易于扩展维护 ;


③ 符合开闭原则 : 用户调用适配器接口 , 只与适配器类进行交互 , 如果需要修改扩展 , 只需要修改适配器类即可 , 目标类 和 现有类 各自都是相互独立的 , 互不影响 ;



2 . 适配器模式 优点 :



① 增加复杂性 : 编写适配器类时 , 需要考虑全面 , 包括被适配者 和 目标类 , 系统复杂性会增加 ;


② 降低可读性 : 系统代码可读性降低 , 可维护性降低 ;



阅读代码时 , 调用系统接口 , 如果调用的是适配器接口 , 还要到处找调用的是哪个现有类的实际接口 ;




适配器模式 与 外观模式对比 :


1 . 相同点 : 都是对现有类进行封装 ;



2 . 行为分析 :



① 外观模式行为 : 外观模式定义了新街口 , 处理多个子系统之间的交互 ;


② 适配器模式行为 : 适配器模式复用原有接口 , 只是简单的转接了一下 , 使两个现存接口 ( 现有类 和 目标类 ) 协同工作 ;



3 . 适配力度分析 :



① 外观模式 : 适配力度很大 , 需要开发整个子系统之间的交互流程 ;


② 适配器模式 : 修改很少的内容 , 只是进行简单的接口转接交互 , 一般不实现具体的功能 ;



适配器模式 相关角色 ( 重点 )


1 . 被适配者 : 实际功能提供者 , 是系统中原有的类 ;



2 . 用户目标接口 : 用户调用该接口 , 实现功能操作 ; 是适配器的父类接口 ;



3 . 适配器 : 需要实现 用户目标接口 , 并在接口中的操作中 , 调用被适配者提供的实际功能 ; 适配器有两种途径实现 , 分别是类适配器 , 对象适配器 ;



① 类适配器 : 继承被适配者 , 通过 super 访问被适配者方法 ;


② 对象适配器 ( 推荐 ) : 在适配器中维护一个被适配者成员变量 , 通过成员变量访问被适配者方法 ;



适配器模式 ( 对象适配器 ) 代码实现流程 ( 重点 )


1 . 明确被适配者 : 被适配者 是一个现有类 , 该类保持不变 ;



目录
相关文章
|
3月前
|
设计模式 前端开发 算法
【面试题】 ES6 类聊 JavaScript 设计模式之行为型模式(二)
【面试题】 ES6 类聊 JavaScript 设计模式之行为型模式(二)
|
1月前
|
设计模式 存储 安全
Java设计模式---结构型模式
Java设计模式---结构型模式
|
3月前
|
设计模式 算法
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
39 1
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
|
3月前
|
设计模式 Java 应用服务中间件
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
31 1
|
3月前
|
设计模式 缓存 安全
设计模式 - 创建型模式_ 单例模式 Singleton Pattern
设计模式 - 创建型模式_ 单例模式 Singleton Pattern
39 0
|
1月前
|
设计模式 存储 算法
Java设计模式---行为型模式
Java设计模式---行为型模式
|
1月前
|
设计模式 算法 安全
Java设计模式---创建型模式
Java设计模式---创建型模式
|
2月前
|
设计模式 存储 安全
【设计模式】创建型模式之单例模式(Golang实现)
【2月更文挑战第3天】一个类只允许创建一个对象或实例,而且自行实例化并向整个系统提供该实例,这个类就是一个单例类,它提供全局访问的方法。这种设计模式叫单例设计模式,简称单例模式。
34 1
|
3月前
|
设计模式 安全 Java
Java 设计模式最佳实践:二、创建型模式
Java 设计模式最佳实践:二、创建型模式
35 0
|
3月前
|
设计模式 关系型数据库 程序员
【设计模式】设计原则
【1月更文挑战第12天】【设计模式】设计原则