设计模式
单例设计模式
- 使用场景:需要对象的唯一性,性能浪费太多时使用
- 更关键的是有的类存在多个实例会存在逻辑错误,例如序号生成器
- 例如:例如数据库链接,配置信息读取
工厂模式
- 用一个方法来代替new关键字,隐藏复杂的初始化
- 适用场景:适用于需要父子类替换的对象(多态)
- jdk中:Proxy.newProxyInstance;class.newInstance();Boolean.valueOf(); Integer.parseInt();
简单工厂模式
- 为所有的产品子类实现一个相同的接口,通过工厂获取不同子类的实例
- 但是不满足对“对扩展开发,对修改关闭”的原则
工厂方法模式
- 定义一个产品接口,同时定义一个工厂接口
- 产品子类和工厂子类成对出现,一个工厂子类只生产一种产品
抽象工厂模式
- 定义多个产品接口,定义一个工厂接口
- 一个工厂可以产生多种类型的产品
- 工厂方法模式中一个工厂只能生产一种产品,而抽象工厂可以生产多个。
https://www.cnblogs.com/zhi-hao/p/4028169.html
https://blog.youkuaiyun.com/qq_32623363/article/details/78246678
工厂模式和ioc
- ioc解决的其实是调用者和被调用者耦合的问题,不通过硬编码进行耦合(工厂模式),而是配置(ioc)
- 在使用ioc时:
- 接口和实现分离,调用者应该不关注具体的实现。具体的实现应该交给ioc容器
- 支持热拔插,项目运行后,修改spring xml的注入配置属性
- ioc利用反射,可以动态生成对象,更换依赖的包,或者更换类就能修改。
- 如果使用工厂模式:
- 在工厂中需要自己来实例化实现,调用者与特定工厂耦合,间接和被调用者耦合
- 工厂模式中有大量的分支,如果需求变化需要修改代码
- 如果调用者和被调用者间存在耦合不方便进行测试
https://blog.youkuaiyun.com/H12KJGJ/article/details/73614258
代理设计模式
- 代理类和被代理类实现同一个接口,用户访问的时候直接访问代理对象,然后让代理对象去访问被代理对象。使得不直接访问被代理类
- jdk中:Proxy.newProxyInstance();Spring里面的AOP就使用了代理模式
适配器模式
- 已经存在的相同功能的代码,但是接口不兼容,不能直接调用。这个时候可以使用适配器模式进行转换
- jdk中:InputstreamReader ;Arrays.asList(); HashSet封装HashMap
模板模式
- 父类定义流程,子类实现流程。
- jdk中:inputstream reader
抽象类和接口的选择
- 模板模式使用抽象类,定义主要流程,细节交给子类来实现
- 接口是用来定义行为规范。例如是Runnable
- java中类的继承只能是单继承,而接口可以是多实现
策略模式
- 定义一系列算法并可以互相替换。
- jdk中的各种TreeSet上传入comparator
装饰器模式
- 对对象的功能进行增强时,就可以使用该模式。不影响原有接口功能,进行增强
- 装饰类和被装饰类都必须属于同一接口或者父类
- jdk中:在io中会使用到BufferedWriter;BufferedInputStream
观察者模式
- 当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
- 被观察者发出一条信息,然后被观察者进行相应的处理
- 各种监听回调使用的就是这种模式
门面模式(外观模式)
- 隐藏复杂的内部实现,为客户端提供简化的接口
- 角色划分:门面角色、子系统、客户端角色(通过门面调用子系统)
- 优点:
- 松耦合:客户端和子系统间的耦合
- 使用更加简单:不用关注子系统的复杂实现
- 更好的划分访问层次
- socket就是一个典型的门面,将tcp/ip复杂的逻辑进行封装,程序员只用和门面打交道