Java常用的十二种设计模式

Java常用设计模式

  • 设计模式介绍
  • 设计模式的重要性
  • 设计模式的目的
  • 单例模式
    • 推荐使用的单例模式
  • 工厂模式
  • 原型模式
  • 建造者模式
  • 适配器模式
  • 享元模式
  • 装饰者模式
  • 策略模式
  • 观察者模式
  • 责任链模式
  • 模板方法模式
  • 代理模式

配合 尚硅谷Java设计模式 学习效果更佳!视频连接

设计模式介绍

  1. 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,
    模式不是代码,而是某类问题的通用解决方案,设计模式(Design pattern)
    代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的一段时
    间的试验和错误总结出来的。

  2. 设计模式的本质提高 软件的扩展性,维护性,通用性和灵活性,并降低软件的复杂
    度。

  3. > 是经典的书,作者是 Erich Gamma、Richard Helm、Ralph
    Johnson 和 John Vlissides Design(俗称 “四人组 GOF”)

  4. 设计模式并不局限于某种语言,java,php,c++ 都有设计模式

设计模式的重要性

  1. 软件工程中,设计模式 (design pattern) 是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领域引入到计算机科学

  2. 大厦 VS 简易房
    一栋大厦的建造需要经过各种可行性研究,结构规划,以及许多设计人员参与设计与调研才能在正确的实施。
    而简易房无需那么多的步骤也可以建造成功,但是相应的在高度上,稳定性上会远远落后于大厦。

  3. 拿实际工作经历来说, 当一个项目开发完后,如果客户提出增新功能,怎么办/p>

  4. 如果项目开发完后,原来程序员离职,你接手维护该项目怎么办(维护性[可读性、规范性])

  5. 目前程序员门槛越来越高,一线IT公司(大厂),都会问你在实际项目中使用过什么设计模式,怎样使用的,解决了什么问题。

  6. 设计模式在软件中哪里向对象(oo)=>功能模块[设计模式+算法(数据结构)] =>框架[使用到多种设计模式] => 架构 [服务器集群]

  7. 如果想成为合格软件工程师,那就花时间来研究下设计模式是非常必要的.

设计模式的目的

编写软件过程中,程序员面临着来自耦合性,内聚性 以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让程序(软件),具有更好的

  1. 代码重用性 (即:相同功能的代码,不用多次编写)
  2. 可读性 (即:编程规范性, 便于其他程序员的阅读和理解)
  3. 可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)
  4. 可靠性 (即:当我们增加新的功能后,对原来的功能没有影响)
  5. 使程序呈现 高内聚,低耦合 的特性,

分享金句: 设计模式包含了面向对象的精髓,“懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要”
Scott Mayers 在其巨著《Effective C++》就曾经说过:C++老手和 C++新手的区别就是前者手背上有很多伤疤。

单例模式

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

饿汉式(静态常量)

饿汉式(静态代码块)

优缺点:

  1. 优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
  2. 缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始
  3. 这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,在单例模式中大多数都是调用getlnstance方法,但是导致类装载的原因有很多种,因此不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance就没有达到lazy loading的效果
  4. 结论: 这种单例模式可用,可能造成内存浪费

懒汉式(非线程安全)

优缺点:

  1. 起到了Lazy Loading的效果,但是只能在单线程下使用。
  2. 如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式
  3. 结论: 在实际开发中,不要使用这种方式.

懒汉式(线程安全)

优缺点:

  1. 解决了线程不安全问题
  2. 效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例,直接return就行了。方法进行同步效率太低
  3. 结论: 在实际开发中,不推荐使用这种方式.

推荐使用的单例模式

双重检查(推荐使用)

优缺点:

  1. Double-Check概念是多线程开发中常使用到的,如代码中所示,我们进行了两次if (singleton == null)检查,这样就可以保证线程安全了。
  2. 这样,实例化代码只用执行一次,后面再次访问时,判断 if(singleton == null),直接return实例化对象,也避免的反复进行方法同步.
  3. 线程安全; 延迟加载; 效率较高
  4. 结论: 在实际开发中,推荐使用这种单例设计模式

静态内部类(推荐使用)

优缺点:

  1. 这种方式采用了类装载的机制来保证初始化实例时只有一个线程。
  2. 静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getlnstance方法,此时装载SingletonInstance类,从而完成Singleton的实例化。
  3. 类的静态属性只会在第一次加载类的时候初始化,所以在这里JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
  4. 优点:避免了线程不安全,利用静态内部类特点实现延迟加载,效率高
  5. 结论: 在实际开发中,推荐使用这种单例设计模式

枚举(推荐使用)

优缺点:

  1. 这借助JDK1.5中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。
  2. 这种方式是Effective Java作者Josh Bloch提倡的方式
  3. 结论: 推荐使用

注意事项

Java常用的十二种设计模式

来源:遇见你之前.

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年2月8日
下一篇 2022年2月8日

相关推荐