简单整理 - 常用设计模式
一、工厂模式(对象创建型模式)
1、简单工厂模式:通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例
2、工厂方法模式:Factory依赖它的子类来定义工厂方法createProduct(),工厂方法返回恰当的产品对象即可。
3、抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,每个工厂只能创建一类产品。
抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类
二、单例模式(对象创建型模式)
1、饿汉式 (定义时实例化,static块内实例化)
2、懒汉式(synchronized,DoubleCheck-volatile,innerClass-jvm内部类特性)
内部类:能被反射攻击,通过【构造函数,判断对象是否已经存在】解决。序列化 都可能破坏单例,通过【写readResolve】,解决
3、注册式(枚举式,容器式-ConcurrentHashMap, ThreadLocal)
枚举式:不怕序列化,反序列化,能保证单例。
容器式:spring IOC 使用容器式。
ThreadLocal:伪单例。同一线程内保持单例。例子:使用ThreadLocal实现动态多数据源动态切换。
三、原型模式(对象创建型模式)
原型模式是指 原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
1、简单克隆
2、深度克隆
四、代理模式(结构型设计模式)
目的:一保护目标对象,二增强目标对象。为其他对象提供一种代理,以控制对这个对象的访问。使代理对象与真实被调用对象分离。代理对象在客户端和目标对象之间起到中介作用。
1、静态代理
在使用静态代理时,被代理对象与代理对象需要一起实现相同的接口或者是继承相同父类,因此要定义一个接口或抽象类.
优点:可以做到在不修改目标对象的功能前提下,对目标功能扩展.
缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多。同时,一旦接口增加方法,目标对象与代理对象都要维护。
2、动态代理
能够在程序运行时JVM才为被代理对象生成代理对象。
JDK实现方式:实现接口的方式,必须有接口。生成代理简单,通过反射调用。
CGLIB实现方式:继承类的方式,任何普通类都可。生成复杂,FastClass,调用效率高。不能代理final的方法。
字节码重组。
五、委派模式(行为模式)
委派模式:负责任务的调用和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果。
Delegage结尾的类一般是委派模式;类名中包含Dispatch的一般也是委派模式。Spring中的DispacherServlet就是委派模式。
六、策略模式
Strategy pattern 分别封装算法,可以相互替换。避免ifelse或switch。
场景:选择一种算法,或者类的行为不同的相似类。
JDK中Comparator就是经典策略模式。
Spring中的Resource,InstantitionStrategy也是。
七、模板模式(行为模式)
Template Method Pattern适用场景:
1、流程化执行,
2、各子类中公共的行为被提取出来并集中到一个公共的父类中。
例子:HttpServlet,mybatis中的BaseExecutor
八、适配器模式(结构型设计模式)- 包装模式
一个类的接口转换成客户期望的另一个接口,使原本的接口不兼容的类可以一起工作。
有点亡羊补牢的感觉。例如电源插转换头、手机充电转换头、显示器转接头。
Class<? extends LoginAdapter> clazz
九、装饰者模式(结构型设计模式)- 包装模式
decorator 用来给一个类,增加或动态增加功能/职责。
可以用来代替继承,更有弹性。
例子:IO类
十、观察者模式(行为型设计模式)发布订阅模式
1、JDK observer/oberverable
2、google的guava。轻松实现观察者模式的解决方案。
通过注解的方式,@Subscribe和EventBus
spring中的contextLoadListner
十一、设计模式对比
- 策略模式&工厂模式:
- 策略模式属于行为模式,工厂模式属于创建模式。
- 工厂模式主要是创建,策略模式是接受工厂创建对象,实现不同行为。
- 策略模式&委派模式
- 策略模式是委派模式内部的一种实现形式,策略模式关注的结果是否能相互替代。
- 委派模式更关注分发和调度的过程
- 模板方法模式&工厂方法模式
- 工厂方法是模板方法的一种特殊实现。
- 对于工厂方法模式的create()方法而言,相当于只有一个步骤的模板方法模式。
- 模板方法模式&策略模式
- 模板方法和策略模式都有封装算法。
- 策略模式是使不同算法可以相互替换,且不影响客户端应用层的使用。
- 模板方法是针对定义一个算法的流程,将一些有细微差异的部分交给子类实现。
- 模板方法模式不能改变算法流程,策略模式可以改变算法流程且可替换。策略模式通常用来代替if...else...等条件分支语句。
- 装饰者模式&静态代理模式
- 装饰者模式关注点在于给对象动态添加方法,而代理更加注重控制对对象的访问。
- 代理模式通常会在代理类中创建被代理对象的实例,而装饰者模式通常把被装饰者作为构造参数。
- 装饰者模式&适配器模式
- 装饰者模式和适配器模式都是属于包装器模式(Wrapper Pattern)。
- 装饰者模式可以实现被装饰者与相同的接口或者继承被装饰者作为它的子类,而适配器和被适配者可以实现不同的接口。
- 适配器为了兼容(),装饰器为了扩展功能(is-A)。
- 适配器模式和静态代理模式
- 适配器可以结合静态代理来实现,保存被适配对象的引用,但不是唯一的实现方式。
- 适配器模式和策略模式
- 在适配业务复杂的情况下,利用策略模式优化动态适配逻辑。
简单整理 - 常用设计模式相关推荐
- 23种常用设计模式的UML类图
23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源码)与<设计模式:可复用面向对象软件的基础>(源码)两书中介绍的设计模式与UML图. 整 ...
- Spring常用设计模式--简单工厂模式
本专栏内容参考自:咕泡学院Tom老师的<Spring5核心原理与30个类手写实战>,仅作个人学习记录使用,如有侵权,联系速删. 工厂模式的由来: 在现实生活中我们都知道,原始社会自给自 ...
- IntellJ IDEA 基础之 常用快捷键的简单整理
IntellJ IDEA 基础之 常用快捷键的简单整理 目录 IntellJ IDEA 基础之 常用快捷键的简单整理 一.简单介绍 二.演示操作环境 二.Ctrl 1.Ctrl + F 在当前文件进行 ...
- Vue 之 echarts 图表数据可视化常用的一些图表/动态图表/3D图表的简单整理
Vue 之 echarts 图表数据可视化常用的一些图表/动态图表/3D图表的简单整理 目录 Vue 之 echarts 图表数据可视化常用的一些图表/动态图表/3D图表的简单整理 一.简单介绍 二. ...
- IntellJ IDEA 基础之 一些常用插件plugin 简单整理 (辅助提高编写代码效率)
IntellJ IDEA 基础之 一些常用插件plugin 简单整理 (辅助提高编写代码效率) 目录 IntellJ IDEA 基础之 一些常用插件plugin 简单整理 (辅助提高编写代码效率) 一 ...
- 常用设计模式 简单实例
1.单例设计模式 所谓单例设计模式简单说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生.具体实现步骤如下: (1) 将采用单例设计模式的类的构造方法私有 ...
- 软件测试|测试开发之路--UI 自动化常用设计模式
接上一次的帖子,今天讲一下我再 UI 自动化中常用的设计模式. 由于网上已经有非常多的文章详细讲解了设计模式的编码实现,所以我今天也就不讲实现细节了. 就是讲我也讲不出什么花来,只是网上的文章基本都是 ...
- 7 种 Javascript 常用设计模式学习笔记
7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...
- java 系统 类_JAVA系统类 System的简单整理
对系统属性看着JDKapi做了简单的记录,尤其是文件分隔符,以及获取系统时间,数组拷贝实用比较多谢,随意正对这几个做下简单整理,需要引入junit单元测试的jar包 //获取所有系统属性 @Test ...
- 打死都要记住!微服务架构的常用设计模式!
作者:duanxz 来源:cnblogs.com/duanxz/p/3514895.html 大家好,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许我休息一下哈).今天跟大家分享微服务架 ...
最新文章
- c++数据结构队列栈尸体_一本正经的聊数据结构(3):栈和队列
- iOS开发知识点总结
- C++ kadane算法的实现之二(附完整源码)
- c++开发教程之自定义类型的运算
- 云服务器可以安装操作系统么,云服务器安装操作系统吗
- 【渝粤题库】陕西师范大学400005 中国传统文化 作业(专升本)
- mysql多张表join_mysql 连接查询(多表查询)+子查询-初学教程 3【重点】
- 如何保养DVD刻录机
- 米斯特白帽培训讲义(v2)信息收集
- pytorch中unsqueeze()和squeeze()函数
- python grep awk_文本处理三剑客:grep、sed和awk命令介绍
- charles证书下载
- Cadence学习之路:什么是PCB工艺的正片与负片
- uniapp接入谷歌广告
- 3D 沙盒游戏之人物的点击行走移动
- oracle IMO史上最详细使用文档
- 动态分区式内存管理(完整代码)
- 精仿交易猫手游1:1源码可运营 支持二维码收款
- 线性规划问题(LP问题)
- 程序人生 | 从导游转行测试工程师:人总在期盼一个改变自己的机会
热门文章
- 给控件做数字签名之二:生成证书文件
- Spring Boot整合模板引擎thymeleaf
- 潍坊首个小学“教育创客空间”落户呼家庄小学 萝卜(创客)教育走进小学课堂...
- RedHat下通过Rdesktop连接window远程桌面
- 弹框中的elment-form在弹框重新打开后,怎么初始化验证信息
- Android 开机自启动应用
- Virident:PCIe SSD更能发挥闪存的特长
- hdu 1242 Rescue(BFS入门)
- JQuery Lightbox -- 一个简单而又谦恭的用来把图片覆盖在当前页面上的脚本
- 如何利用【百度地图API】,制作房产酒店地图?(上)——制作自定义标注和自定义信息窗口...