常用设计模式
2020-08-14 14:52:24 0 举报
AI智能生成
常用设计模式
作者其他创作
大纲/内容
结构型模式
单例模式
饿汉式
懒汉式
双重检查锁
静态内部类
反射破坏单例
解决方案:构造器直接throw
序列化破坏单例
解决方案:重写readObject(){return INSTANCE;}
注册式单例
枚举单例
容器缓存(ConcurrHashMap)
ThreadLocal线程单例
原型模式
浅克隆
深克隆
可用OOS与OIS实现
代理模式
静态代理
合成复用原则的表现,不使用继承而是使用成员变量
例子:1.媒婆帮人找媒,2.代理service实现动态切换数据源
动态代理
JDK方式
实现IvocationHandler
获取对象入口Proxy.newProxyInstance
原理:反射获取接口的方法,动态生成代理的java类代码,并编译加载
CGLib
实现MethodInterceptor
获取对象入口new Enhancer().create()
原理:ASM框架动态生成Class字节码
适配器模式
将一个类转化成另一个接口,使原本不能一起工作的类一起工作
业务场景:方法和需求不匹配,但入参或返回值相似或相同
例子:220V转5V
装饰者模式
不改变原有对象的基础上,将功能附加到对象上
和适配器都是包装模式,是特殊的适配器模式
是继承的有力补充
例子:各种IO类,InputStream
设计模式
创建型模式
简单工厂模式
ICourse create(String courseName)
ICourse create(String className)
ICourse create(Class<? extends ICourse> clazz)
例子
LoggerFactory.getLogger(Class clazz)
Calendar.newInstance()
缺点
职责过重,不易于拓展过于复杂的产品结构
工厂方法模式
接口:class ICourseFactory{}
ICourse create()
实现类:class JavaCourseFactory implements ICourseFactory
类的个数过多,增加复杂度
增加系统的抽象性和理解难度
抽象工厂模式
ICourse getCourse();
IVideo getVideo();
其实就是工厂方法的升级(一个抽象方法改为多个抽象方法)
拓展产品族时需要修改工厂方法,违反开闭原则
行为性模式
模板方法模式
定义算法的骨架,子类提供一个或多个步骤实现
可以在不改变骨架的情况下,重新定义某些步骤
例子:AbstractList
例子:BaseExecutor
优点:复用性强,拓展性强,符合开闭原则
缺点:如果父类增加抽象方法,所有子类都需要改
策略模式
定义了算法家族,可以相互替换
例子:多种促销活动
例子:Comparator
策略之间也可以继承
优缺点
优点::符合开闭原则,避免if else语句
缺点:客户必须知道所有策略,策略多会增加复杂性
委派模式
负责任务的调用和分配任务
特殊的静态代理的全权代理
例子:DispatcherServlet
Leader和Employee是同级关系,都实现了IEmployee接口
命名中含Dispatcher和delege
观察者模式
定义了对象一对多的依赖关系,又称发布订阅模式
0 条评论
回复 删除
下一页