设计模式是是程序设计的高级思想,23种,在框架中使用
可分为三大类:创建型、结构型、行为型
创建型:创建对象
单例:一个类只有一个实例,并提供一个全局访问方法。
原型:拷贝对象。eg:java的clone(内存拷贝,不会走构造函数)、反序列化
简单工厂:少量if-else,多态
工厂方法:大量if-else,由继承的子类进行实例化。维度决定层度
抽象工厂:超量 & 穿插 if-else,通过接口类,来创建一组产品
建造者:XXXBuild()。封装了产品的构造过程,但是提供定制其中的元素。方法都返回父类Builder,这样就可以一直点点点了。eg:定制车
结构型:将类或对象按照某种布局形成更大的组合
代理:不影响原有代码,增加横向逻辑。eg:SpringAOP的JDK动态代理,Seat的AT模式
适配器:解决接口之间无法直接匹配的问题。eg:苹果电脑的转换器
桥接:不同维度组装出多种结果。eg:毛笔+墨水=不同的字
装饰者:一个一个往上加,最后要汇总的结果,子类要一个基础类的成员变量。eg:煎饼果子
门面:提供一个 一群接口的 统一访问接口。eg:入职找公司前台
享元:使用共享对象去有效支持大量的细粒度的对象。池技术:通过实例池化,需要就去池里取。eg:字符串,-127~128的整型
组合:将对象组合成树形结构来表现整体的层次结构。eg:部门人员的组织结构
行为型:多个类或对象相互协作完成复杂的流程控制
模板方法:定义算法骨架,其中的算法步骤(abstract)允许由子类实现。eg:煮汤圆与煮饺子
策略:根据行为定义了算法族,相互之间可替换
命令:将请求封装成对象。eg:空调遥控器
责任链:构建处理业务的逻辑链。eg:工作流
状态:允许对象在内部状态改变时改变它的行为。eg:抓娃娃机投币
观察者:对象之间的一对多依赖,一改变,多就收到通知。eg:mq
中介者:集中相关对象之间的沟通和控制方式。
迭代器:hasNext() + next(),顺序访问聚合对象的元素
访问者:为集合中的元素提供多种访问方式。eg:公司和个人询价
备忘录:数据以堆栈的方式存储。eg:ctrl z
解释器:定义语言的语法、解释规则
主要有:单例模式、装饰者模式、适配器模式、 简单工厂模式
==============================================================
一、单例模式
设计一个类,这个类只能创建一个对象,即限制创建对象的数量
步骤:
1、私有化构造方法
2、 在类中创建一个对象,并且用private、static、final修饰
private为了避免在外部直接访问当前对象
static是为了在静态方法中可以返回当前类中的对象
final:可加可不加,加了可以保证不可修改,且提供获取效率
3.、提供一个public修饰的方法getInstance给外部返回一个对象
单例模式的3种获取方式:
- 饿汉模式:预加载模式 (优化方式:静态内部类)
优点:在类加载的时候,就创建好对象放到静态区了,获取对象效率高。线程安全
缺点:类加载效率低,并且static修饰的成员占用资源。
public class Singleton {
/**
* 1、私有化构造方法
*/
private Singleton() {
}
/**2、创建一个对象,并且用private、static、final修饰 */
private static final Singleton INSTANCE =new Singleton();
/**
* 3、提供一个public修饰的方法getInstance给外部返回一个对象
* @return
*/
public static Singleton getInstance() {
return INSTANCE;
}
}
- 懒汉模式:懒加载模式 (优化方式:双重校验锁)
优点:节省资源,在需要的时候创建对象。
缺点:线程不安全。获取对象的时候,效率低
最简单的线程安全的方式:同步方法,效率低
更好的的线程安全的方式:双重校验锁
public class Singleton {
/**
* 1. 私有化构造方法
*/
private Singleton(){}
/**
* 2. 在类中创建一个对象,并且用private、static、final修饰
*/
private static Singleton instance;
/**
* 双重校验锁
*/
public static Singleton getInstance() {
if (instance == null) {//为了提高效率,不用等锁再判断
synchronized (Singleton.class) {
if (instance == null) {//解决线程安全问题
instance = new Singleton();
}
}
}
return instance;
}
}
- 枚举:线程安全
public enum Singleton{
INSTANCE;
}
单例模式使用场景:全局配置文件 、全局日志文件 、节省资源(如,回收站、资源管理器、游戏单开窗口)。。。
获取方式使用选择:一般用饿汉模式,如果有序列化要求,用枚举
===========================================================
二、装饰者模式:XxxDecorator
指的是在不必改变原类(Input)文件和使用继承的情况下,动态地扩展一个类的功能。如缓冲流
实现步骤 :通过对原类文件继承,对原有方法功能的基础上,增强新的功能
============================================================
三、适配器模式:XxxAdaptor
使用场景:不同的类需要配合完成功能,比如转接头
优点:扩展性强,成本低廉
===========================================================
四、简单工厂模式
优点:将生产和消费分离(解耦),即创建对象和使用对象的功能分离,便于管理
缺点:扩展性弱,如果添加了新的产品,则需要修改工厂方法
使用场景:适用于产品数量较少,且不经常改变的情况
用反射来优化代码