相关信息链接:https://zhuanlan.zhihu.com/p/75253493
点击这里获得更多信息
单例模式
工厂模式
抽象工厂模式
建造者模式
原型模式
1.单例模式
**核心作用:**保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
应用的场景:
Windows的任务管理器、垃圾回收站等
常见的5种单例模式:
饿汉式:线程安全、调用效率高、不能延时加载
懒汉式:线程安全、调用率不高、能延时加载
双重检测锁式:由于jvm底层内部模型的原因,偶尔会出现问题
静态内部类式:线程安全、调用率高、能延时加载
枚举单例:线程安全、调用效率高、不能延时加载、
选用:
饿汉式:线程安全、调用效率高、不能延时加载
枚举单例:调用效率高,无延时加载,避免通过反射和反序列化漏洞,好于饿汉式
线程安全、调用率高、能延时加载
静态内部类式好于懒汉式
4.建造者模式
场景:
我们要构建一个复杂的产品时,比如IPhone,这个复杂的产品的创建,有这样的问题需要处理:装配这些子组件是不是有个步骤的问题?
实际的开发中,我们所需要的对象构建时,也非常的复杂,有很多的步骤需要处理
建造者的本质:
分离了对象子组件的单独构造(有builder来负责)和转配(由Director负责),从而可以构造出复杂的对象,
**这个模式适用于:**某个对象构造的过程复杂时使用
由于实现了构造器和装配器的解耦,不同的构造器,相同的装配,也可以做出不同的对象。相同的构造器,不同的装配顺序,也可以做出不同的对象,也就是实现了构造算法,装配算法的解耦,实现了更好的复用。
开发的应用场景:
StringBuilder类中的append方法。
SQL中的preparedStatement
JDOM中,DomBUiler,SAXBUIlder
在对于程序进行维护和升级时
适配器模式
桥接模式
装饰模式
组合模式
外观模式
享元模式
代理模式
1.适配器模式:
将一个类的接口转换成客户希望的另外一个接口,Adapter模式使的原型本由于接口不兼容而不能一起工作的那些类可以一起工作。
模式中的角色:
目标接口:客户所期待的接口,目标可以是具体或抽象的类,也可以是接口
需要适配的类:需要适配的类或者适配者类
适配器:通过包装一个需要适配的对象,把原接口转换成目标接口。
经常用来做旧系统改造和升级
常见的场景:
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWriter(OutputStream)
2.代理模式
核心作用:
通过代理控制对象的访问!可以详细控制访问某个类或者对象时,在调用这个方法前做相应的处理,调用这个方法后做相应的后置修理(AOP面向切口编程的核心机制)
代理模型:核心角色
抽象角色:定义代理角色和真实角色的公共对外方法。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用,关注真实的业务逻辑
代理角色:实现抽象角色是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象的方法,并且可以附加自己的操作
将统一的流程控制放在代理角色中处理。
应用场景:
静态代理(静态定义代理类):由自己的定义的
动态代理:(动态生成代理类):由程序自动生成的代理类
JDK自带的动态代理
Javaassist字节码操作库的实现
CGLIB
ASM(底层使用的指令,可维护性差)
3.桥接模式
场景:商场系统中常见的商品分类,很多商品都是具有多层次的继承关系
电脑–>台式机:–>联想,华硕,神舟
–笔记本:—>联想,华硕,神舟
–平板:–>联想,华硕,神舟
扩展麻烦
桥接:分为两个变化的维度:电脑类型,电脑的品牌
则两种变化的维度是相互独立的,使各个维度可以独立的进行扩展,增加新的品牌或者类型
**应用场景:**JDBC驱动程序
AWT中的peer架构
银行日志的管理:
格式分类:操作日志,交易日志,异常日志
距离分类:本地记录日志,异地记录日志
人力资源系统中的奖金计算模块:
奖金部门:个人奖金,团体奖金,激励奖金
部门分类:人事部,销售部,研发部
OA(办公)系统中的消息处理:
业务类型:普通消息,加急消息,特级消息
发送消息方式:系统消息,手机短信,邮件
4.组合模式:
**场景:**把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方法处理部分对象和整体(递归的原理)
一般在处理树形结构的时候都会用到组合模式
组合模式的核心:
抽象构建角色:定义了叶子和容器构件的共同点
叶子构件角色:无子节点
容器构件模式:有容器的特征,包含子节点
应用的场景:
操作系统的资源管理器
GUI的容器层次图
XML文件的解析
OA系统中组织结构的处理
5.装饰器模式
**职责:**动态的为一个对象增加新的功能
装饰器模式是一种用于替代继承的技术,无需通过继承子类就能扩展对象的新功能,使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
实现的核心:
抽象构件角色:真实角色和装饰对象有相同的接口,这样,客户端对象就能够以与真实对象相同的方式同装饰对象进行交互
具体构件角色:真实的对象,io中的fileInputstream,fileOutputStream
装饰角色:持有抽象构件的引用,装饰对象接受所有客户端的请求,并把这些请求战法给真实的对象,这样,就可以再真实对象调用的前后增加新的功能
具体的装饰类:负责给构件对象增加新的责任。
**应用场景:**java中的io细节
抽象构件角色:
InputStream,OutputStream,Reader,Writer
具体构件角色:
fileInputstream,fileOutputStream
装饰角色:
持有抽象构件的引用fileInputstream,fileOutputStream
具体的装饰类:
负责给构件对象增加新的责任:BufferedOutputStream,BufferedInputStream,
可以对于一个对象进行多次组合,产生不同行为的组合,得到功能更加强大的对象。但是装饰模式易于出错,调试麻烦,难以排查错误
6.外观模式
用的最频繁的模式
**最少知识原则:**一个软件实体应当尽可能少的与其他实体发生相互作用
为子系统提供一个统一的入口,封装子系统的复杂性,便于客户端调用
7.享元模式:
**场景:**内存属于稀缺资源,不要随便浪费,如果有很多个完全相同或者相似的对象,我们可以通过享元模式,节省内存
**核心:**享元模式以共享的方式高效地支持大量细粒度对象的重用
享元对象能做到共享的关键就是区分了内部状态和外部状态
内部状态:可以共享,不会随环境变化而改变
外部状态:不可以共享,会随环境变化而改变
模板方法模式
命令模式
迭代器模式
观察者模式
中介者模式
备忘录模式
解释器模式
状态模式
策略模式
职责链模式
访问者模式
未完。。。。