当前位置: 首页 > news >正文

Java常见设计模式

6ebd47a6d0b94af98098875da987498c.jpg单例模式:程序自始至终只创建一个对象。

 

 

应用场景:1.整个程序运行中只允许一个类的实例时

 

     2.需要频繁实例化然后销毁的对象

 

     3.创建对象时耗时过多但又经常用到的对象

 

     4.方便资源相互通信的环境

 

懒汉式线程不安全问题解决方案:

 

双重检查加锁机制:

 

既可实现线程安全,又可使性能不受到很大的影响,所谓“双重检查”指的是并非每次调用getInstance方法都需要同步,进入方法后先检查实例是否存在,不存在的情况下才进入下面的同步块,这是第一层检查。进入同步块后再次进行检查实例是否存在,如果不存在则在同步块内创建实例,这是第二次检查。

 

双重检查机制实现会使用volatile,它的意思是被volatile修饰的变量的值将不会被本地缓存,所有对该变量的读写都直接操作共享内存,从而确保多个线程能正确处理该变量。

 

public class LazySingleton {

    private static volatile LazySingleton dl = null;

    private LazySingleton() {

    }

    public static LazySingleton getInstance() {

        if (dl == null) {

            synchronized (LazySingleton.class) {

                if (dl == null) {

                    dl = new LazySingleton();

                }

            }

        }

        return dl;

    }

}

内部类解决(延迟加载,线程安全):

 

public class SingletonInner {  

    /**

     * 内部类实现单例模式

     * 延迟加载,减少内存开销   

     */  

    private static class SingletonHolder {  

        private static SingletonInner instance = new SingletonInner();  

    }  

 

    /**

     * 私有的构造函数

     */  

    private SingletonInner() {}  

 

    public static SingletonInner getInstance() {  

        return SingletonHolder.instance;  

    }  

 

    protected void method() {  

        System.out.println("SingletonInner");  

    }  

}

 

单例模式实际应用:

 

1.Spring中bean默认是单例模式

 

2.网站的计数器

 

3.应用程序的日志应用

 

4.web应用的配置读取,由于配置文件是共享的资源。

 

5.数据库连接池设计

 

6.多线程的线程池

 

2.工厂模式:这是一种创建型模式,它提供了一种创建对象的最佳方式,通过一个共通的接口来指向新创建的对象,创建对象不再是由当前类实例化,而是由工厂类完成,在工厂中只需告知对象类型即可,工厂模式中必须依赖接口。

 

实际应用:1.数据库工厂(不同语言)

 

3.观察者模式:当一个对象被其他多个对象所依赖,当一个对象发生变化时,其他依赖该对象的对象都会收到通知并随着变化,比如警报、微信公众号推送,自动通知每个订阅的客户

 

4.代理模式:一个代理类代表一个真实类的访问

 

实际应用:1.数据库工厂(不同语言)

 

5.适配器模式:用于解决软件实体间的接口不兼容问题。

 

6.策略模式:定义一系列算法将它们统一封装起来并且使他们可以相互替换,策略模式的重心不是如何实现这些算法,而是如何组织、调用这些算法,使程序更灵活、可维护、可扩展

 

7.职责链模式(请假流程):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。在职责链模式中很多对象由某一个对象对下家的引用而连接起来形成一条链,请求在这个链上传递,直到链上的某个对象处理此请求

 

8.模版方法模式:由两部分组成,抽象父类和具体的子类完成,通常在抽象父类中封装了子类的算法框架,包括一些公共方法以及子类的方法执行顺序。子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类中的方

http://www.lryc.cn/news/184686.html

相关文章:

  • Hive 【Hive(七)窗口函数练习】
  • C++深入学习part_1
  • leetCode 300.最长递增子序列 (贪心 + 二分 ) + 图解 + 优化 + 拓展
  • Spring加载后置处理器方式之模板方法
  • 【高性能计算】CUDA编程之OpenCV的应用(教程与代码-4)//test error
  • 高德地图行政区域四级级联数据拉取;省市区县乡镇级联数据
  • Qt_基础
  • 最新AI创作系统源码ChatGPT网站源码V2.6.3/支持Midjourney绘画/支持OpenAI GPT全模型+国内AI全模型
  • UML建模语言分析和设计
  • SystemUI导航栏
  • 3d 贴图下载quixel
  • Linux权限维持
  • 互联网通信的核心协议HTTP和HTTPS
  • javaWeb网上购物系统的设计与实现
  • MySQL 主从复制、读写分离
  • 基于虚拟阻抗的下垂控制——孤岛双机并联Simulink仿真
  • windows内核编程(2021年出版)笔记
  • 时序预测 | MATLAB实现EMD-iCHOA+GRU基于经验模态分解-改进黑猩猩算法优化门控循环单元的时间序列预测
  • FFmpeg 命令:从入门到精通 | FFmpeg 解码流程
  • 连接虚拟机工具推荐
  • 万字详解HTTP协议面试必备技能
  • Debian跳过grub页面
  • 【已解决】RuntimeError Java gateway process exited before sending its port number
  • 数据结构与算法-循环链表、双向链表
  • javascript中依次输出元素并不断循环实现echarts柱图动画效果
  • 互联网Java工程师面试题·Memcached篇·第一弹
  • git 详解-提升篇
  • RPA的安全风险及应对策略
  • 数据结构与算法--贪心算法
  • 【Unity3D】UGUI物体世界坐标转屏幕坐标问题