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.hqwc.cn/news/128611.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ学习笔记(下):延迟队列,发布确认高级,备份交换机

十、延迟队列 延迟队列 概念&#xff1a; 延迟队列使用场景&#xff1a; 流程图&#xff1a; 延迟队列整合Springboot 导入依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

c++视觉ROI 区域和ROI 区域图像叠加

ROI 区域提取和ROI 区域图像叠加 ROI 区域提取 #include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image cv::imread("1.jpg");// 检查图像是否成功加载if (image.empty()) {std::cerr << "Error: Could not read the image." …

【致敬未来的攻城狮计划】第2期 作业汇总贴 + 获奖公布

一、写在前面 时间过得真快&#xff0c;距离 【致敬未来的攻城狮计划】第2期 的发起&#xff0c;已经过去一个多月了&#xff0c;而第2期的真正学习考核期也将在5/13的18点整正式结束。 关于第2期的活动计划&#xff0c;感兴趣的可以参见这里&#xff1a;【重磅推出】《致敬未…

2019年[海淀区赛 第2题] 阶乘

题目描述 n的阶乘定义为n!n*(n -1)* (n - 2)* ...* 1。n的双阶乘定义为n!!n*(n -2)* (n -4)* ...* 2或n!!n(n - 2)*(n - 4)* ...* 1取决于n的奇偶性&#xff0c;但是阶乘的增长速度太快了&#xff0c;所以我们现在只想知道n!和n!!末尾的的个数 输入格式 一个正整数n &#xff…

【Acwing1010】拦截导弹(LIS+贪心)题解

题目描述 看本文需要准备的知识 1.最长上升子序列&#xff08;lis&#xff09;的算法思想和算法模板 2.简单了解贪心算法的思想 思路分析 本题有两问&#xff0c;第一问直接用lis的模板即可&#xff0c;下面重点看第二问 思路是贪心&#xff1a; 贪心流程&#xff1a; 从…

NLP项目:维基百科文章爬虫和分类【02】 - 语料库转换管道

一、说明 我的NLP项目在维基百科条目上下载、处理和应用机器学习算法。相关上一篇文章中&#xff0c;展示了项目大纲&#xff0c;并建立了它的基础。首先&#xff0c;一个 Wikipedia 爬网程序对象&#xff0c;它按名称搜索文章&#xff0c;提取标题、类别、内容和相关页面&…

mysql面试题16:说说分库与分表的设计?常用的分库分表中间件有哪些?分库分表可能遇到的问题有哪些?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说说分库与分表的设计? 在MySQL中,分库与分表是常用的数据库水平扩展技术,可以提高数据库的吞吐量和扩展性。下面将具体讲解MySQL中分库与分表…

一盏茶的功夫帮你彻底搞懂JavaScript异步编程从回调地狱到async/await

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4d8; 1. 引言 &#x1f4d8; 2. 使用方法 &#x1f4d8; 3. 实现原理 &#x1f4d8; 4. 写到最后…

医疗器械标准目录汇编2022版共178页(文中附下载链接!)

为便于更好地应用医疗器械标准&#xff0c;国家药监局医疗器械标准管理中心组织对现行1851项医疗器械国家和行业标准按技术领域&#xff0c;编排形成《医疗器械标准目录汇编&#xff08;2022版&#xff09;》 该目录汇编分为通用技术领域和专业技术领域两大类&#xff0c;通用…

项目进展(十)-解决ADS1285在调试时出现的问题

一、解决大坑 在项目进展&#xff08;九&#xff09;-完善ADS1285代码这边博客中&#xff0c;看似解决了问题&#xff0c;可以去读数据&#xff0c;但是其实是给自己挖大坑&#xff0c;这边博客就是来填坑的。   首先呢&#xff0c;上篇博客说的是用0x12指令来读取数据&#…

cv2.split函数与cv2.merge函数

split函数用于图像BGR通道的分离 merge函数用于可将分开的图像通道合并到一起 1.split函数的使用 这是原图&#xff0c;我们使用split函数对其三个通道进行分离。 注意&#xff1a;split函数分离通道的顺序是B、G、R。 以下方法是将三个通道的值都设置为与某一个通道相同。…

【SpringCloud】认识微服务

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 认识微服务 一、 服务架构演变1.1 单体架构…