设计模式

设计模式

单例设计模式

  • 使用场景:需要对象的唯一性,性能浪费太多时使用
  • 更关键的是有的类存在多个实例会存在逻辑错误,例如序号生成器
  • 例如:例如数据库链接,配置信息读取

工厂模式

  • 用一个方法来代替new关键字,隐藏复杂的初始化
  • 适用场景:适用于需要父子类替换的对象(多态)
  • jdk中:Proxy.newProxyInstance;class.newInstance();Boolean.valueOf(); Integer.parseInt();

简单工厂模式

  • 为所有的产品子类实现一个相同的接口,通过工厂获取不同子类的实例
  • 但是不满足对“对扩展开发,对修改关闭”的原则

工厂方法模式

  • 定义一个产品接口,同时定义一个工厂接口
  • 产品子类和工厂子类成对出现,一个工厂子类只生产一种产品

抽象工厂模式

  • 定义多个产品接口,定义一个工厂接口
  • 一个工厂可以产生多种类型的产品
  • 工厂方法模式中一个工厂只能生产一种产品,而抽象工厂可以生产多个。

https://www.cnblogs.com/zhi-hao/p/4028169.html
https://blog.csdn.net/qq_32623363/article/details/78246678

工厂模式和ioc

  • ioc解决的其实是调用者和被调用者耦合的问题,不通过硬编码进行耦合(工厂模式),而是配置(ioc)
  • 在使用ioc时:
    • 接口和实现分离,调用者应该不关注具体的实现。具体的实现应该交给ioc容器
    • 支持热拔插,项目运行后,修改spring xml的注入配置属性
    • ioc利用反射,可以动态生成对象,更换依赖的包,或者更换类就能修改。
  • 如果使用工厂模式:
    • 在工厂中需要自己来实例化实现,调用者与特定工厂耦合,间接和被调用者耦合
    • 工厂模式中有大量的分支,如果需求变化需要修改代码
  • 如果调用者和被调用者间存在耦合不方便进行测试

https://blog.csdn.net/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复杂的逻辑进行封装,程序员只用和门面打交道

https://www.cnblogs.com/lthIU/p/5860607.html

你可能感兴趣的:(java)