Java 设计模式-【单例模式】

单例解决了什么问题:为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实例。为了确保对象的唯一性,我们可以通过单例模式来实现,这就是单例模式的动机所在。

单例的应用场景:一般是对于那些业务逻辑上限定不能多例只能单例的情况,例如:类似于计数器之类的存在,一般都需要使用一个实例来进行记录,若多例计数则会不准确。

 

 

饿汉式:

  条件:

  1. 构造器私有化
  2. 本类对象作为本类的属性存在 用static 修饰保证只加载一次,不会重复创建对象
  3. 公共的静态的方法可以通过该方法拿到属性

   优缺点:

    优点:安全

    缺点:可能会导致对象创建过早

 1 package com.设计模式;
 2 
 3 /**
 4  * 饿汉式
 5  */
 6 public class ObjectShow1 {
 7     public static int i = 123;
 8     //静态私有成员,类在加载初期完成初始化;同时带来加载过早的问题
 9     private static ObjectShow1 objectShow1 = new ObjectShow1();
10 
11     private ObjectShow1() {
12         //私有构造函数,只能被列对象初始化
13         System.out.println(i);
14     }
15 
16     //使用public对外开放获取本类对象
17     public static ObjectShow1 getObjectShow1() {
18         return objectShow1;
19     }
20 }
View Code

 

 

懒汉式:

       条件:

  1. 构造器私有化
  2. 本类对象作为本类的属性存在 static 修饰 但是不进行初始化
  3. 公共的静态方法 并且判断是否给属性赋值

优缺点:

    优点:对象总是被需要的时候才被创建 解决了可能加载时机过早的问题

    缺点:在线程初期 线程不安全

 1 package com.设计模式;
 2 
 3 /**
 4  * 懒汉式
 5  */
 6 public class ObjectShow2 {
 7     public static int i = 123;
 8     //静态私有成员,不用构造器进行初始化
 9     private static ObjectShow2 objectShow2 = null;
10 
11     private ObjectShow2() {
12         //私有构造函数,只能被列对象初始化
13         System.out.println(i);
14     }
15 
16     //使用public对外开放获取本类对象,只有调用方法才会进行初始化
17     public static ObjectShow2 getObjectShow2() {
18         if (objectShow2 == null) {
19             objectShow2 = new ObjectShow2();
20         }
21         return objectShow2;
22     }
23 }
View Code

 

 

双重检索式:

       条件:

       1.构造器私有化

       2.本类的对象作为奔雷的属性存在 static 修饰 但不进行初始化

       3.公共的静态方法 并且判断是否给属性赋值

优缺点:

    程序的前期 线程不安全

    Synchronized 锁

    Synchronized 代码块 要求同一时间只有一个线程进入代码块区域

    因为jvm内存模型的原因 双重检索 也会有微小的可能发生问题

 1 package com.设计模式;
 2 
 3 /**
 4  * 双重检索式
 5  */
 6 public class ObjectShow3 {
 7     public static int i = 123;
 8     //静态私有成员,不用构造器进行初始化
 9     private static ObjectShow3 objectShow3;
10 
11     private ObjectShow3() {
12         //私有构造函数,只能被列对象初始化
13         System.out.println(i);
14     }
15 
16     //使用public对外开放获取本类对象,只有调用方法才会进行初始化
17     public static ObjectShow3 getObjectShow3() {
18         if (objectShow3 == null) {
19             //同步块,线程安全的创建实例
20             synchronized (ObjectShow3.class) {
21                 //再次检查实例是否存在,不在才创建
22                 if (objectShow3 == null)
23                     objectShow3 = new ObjectShow3();
24             }
25         }
26         return objectShow3;
27     }
28 }
View Code

 

 

静态内部类式:

条件:

       1.定义一个静态内部类

       2.外部类构造器私有化

       3.外部类的对象 作为内部类的属性存在 static 修饰 进行初始化

       4.公共的静态方法

优缺点:

    解决了,对象创建时机过早的问题

    没有产生线程安全问题

 1 package com.设计模式;
 2 
 3 /**
 4  * 静态内部类式
 5  */
 6 public class ObjectShow4 {
 7     public static int i = 123;
 8 
 9     static class InitObjectShow {
10         private static ObjectShow4 os = new ObjectShow4();
11 
12         public static ObjectShow4 getObj() {
13             return os;
14         }
15     }
16 
17     private ObjectShow4() {
18         System.out.println("ObjectShow4.ObjectShow4");
19     }
20 
21     public void show() {
22         System.out.println("ObjectShow4.show");
23     }
24 }
View Code

 

转载于:https://www.cnblogs.com/shwang/p/9325666.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451934.shtml

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

相关文章

Lua游戏开发----模块

1:游戏目录结构对模块的理解: Base,Common,Game这三个文件夹下都有自己的moduleConfig文件。 base文件夹下的moduleConfig.lua文件是存放游戏基础的模块(例如:游戏视图准备,发牌,托管…

css 引用 方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 CSS 样式一共 3 中使用方法 ——内联式样式表行样式<div style"color:#000;"></div>只能操作1个标签&#xff0…

java构造方法

构造方法是一种特殊的方法&#xff0c;它是一个与类同名且没有返回值类型的方法。对象的创建就是通过构造方法来完成&#xff0c;其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。 构造方法就是与类同名的那个方法…

转 单实例的写法

目录 饿汉法单线程写法考虑线程安全的写法兼顾线程安全和效率的写法坑静态内部类法枚举写法总结参考资料转载: 你真的会写单例模式吗——Java实现 单例模式可能是代码最少的模式了&#xff0c;但是少不一定意味着简单&#xff0c;想要用好、用对单例模式&#xff0c;还真得费一…

网络爬虫--26.Scrapy中下载器中间件Downloader Middlewares的使用

文章目录一. Downloader Middlewares二. 设置随机请求头三. ip代理池中间件一. Downloader Middlewares 二. 设置随机请求头 三. ip代理池中间件

变量名和方法名

变量名&#xff1a;第一个单词的首字母小写&#xff0c;后面每一个单词的首字母大写。如userName; 方法名&#xff1a;第一个单词的首字母小写&#xff0c;后面每一个单词的首字母大写。如setName&#xff08;&#xff09;; 写出让人一眼看懂的变量名和方法名&#xff0c;命名应…

openfire服务器

openfire(原名Wildfire或者JiveMessenger)是由Java语言编写的、基于XMPP协议的服务器&#xff0c;具有跨平台能力&#xff0c;获得了Apache2.0许可证。 openfire是基于XMPP协议的IM的服务器端的一个实现&#xff0c;两个用户想要进行通讯&#xff0c;首先要连接到Openfire。服…

解决eclipse配置Tomcat时找不到server选项(Mars.2也可用)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 集成Eclipse和Tomcat时找不到server选项&#xff1a; 按照网上的步骤如下&#xff1a; 在Eclipse中&#xff0c;窗口(window)——首选项…

网络爬虫--27.csv文件的读取和写入

文章目录一. csv文件二. 读取csv文件的两种方式三. 写入csv文件的两种方式一. csv文件 二. 读取csv文件的两种方式 import csvdef read_csv_demo1():with open(classroom1.csv,r,encodingutf-8,newline) as fp:# reader是一个迭代器reader csv.reader(fp)next(reader)for x i…

Quiver快速入门

Quiver快速入门 装载自&#xff1a;https://github.com/HappenApps/Quiver/wiki/Quiver%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8Quiver 是一个程序员专用的记事本应用&#xff0c;可轻松混合文本、代码、Markdown、LaTeX 到一个记事本中。提供强大的代码编辑功能&#xff0c;以及…

const指针和指向常量的指针

先看下面六种写法&#xff1a; 1. const int p;2. const int *p;3. int const* p;4. int * const p;5. const int * const p;6. int const * const p; 那么我们应该怎么区分上面的写法到底是指向常量的指针还是const指针(表示指针本身是常量)呢&#xff1f; 一个简便方法&#…

配置SQL Server的身份验证方式

下面的文章来源于网络&#xff0c;讲的是怎样配置SQL Server 2005登陆验证方式&#xff0c;但是内容同样适用于SQL Server 2008. 配置SQL Server的身份验证方式 在默认情况下&#xff0c;SQL Server 2005 Express是采用集成的Windows安全验证且禁用了sa登录名。为了工作组环境下…

计算机程序设计艺术+第3卷:排序与查找(第二版)pdf

下载地址&#xff1a;网盘下载 《计算机程序设计艺术排序和查找(第3卷)(第2版)》内容简介&#xff1a;这是对第3卷的头一次修订&#xff0c;不仅是对经典计算机排序和查找技术的最全面介绍&#xff0c;而且还对第1卷中的数据结构处理技术作了进一步的扩充&#xff0c;通盘考虑了…

数据结构与算法--5.Python实现十大排序算法

文章目录0. 相关概念一. 冒泡排序二. 选择排序三. 插入排序四. 希尔排序五. 快速排序六. 归并排序七. 其他0. 相关概念 稳定&#xff1a;如果a原本在b前面&#xff0c;而ab&#xff0c;排序之后a仍然在b的前面。不稳定&#xff1a;如果a原本在b的前面&#xff0c;而ab&#xf…

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 问题

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 maven run as --install 时出错&#xff0c;提示信息如下&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:m…

spring cloud(九):各组件常用配置参数

1、Eureka的常用配置Eureka Server端eureka.server.enable-self-preservation # 设为false&#xff0c;关闭自我保护eureka.server.eviction-interval-timer-in-ms # 清理间隔&#xff08;单位毫秒&#xff0c;默认是60*1000&#xff09;eureka.environmentdev #指定环境eureka…

JSON与XML的区别比较

1.定义介绍 (1).XML定义 扩展标记语言 (Extensible Markup Language, XML) &#xff0c;用于标记电子文件使其具有结构性的标记语言&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type defini…

ajax传递数组:属性traditional设置

jQuery.ajaxSettings.traditional true; $.post("",function(){});转载于:https://www.cnblogs.com/HansZimmer/p/9334006.html

Python面试题总结(9)--高级特性

文章目录1. 函数装饰器有什么作用&#xff1f;请列举说明&#xff1f;2. Python 垃圾回收机制&#xff1f;3. 魔法函数 _call_怎么使用?4. 如何判断一个对象是函数还是方法&#xff1f;5. classmethod 和 staticmethod 用法和区别6. Python 中的接口如何实现&#xff1f;7. Py…

I/O流讲解

本文来自&#xff1a;曹胜欢博客专栏&#xff1a;http://blog.csdn.net/csh624366188 在软件开发中&#xff0c;数据流和数据库操作占据了一个很重要的位置&#xff0c;所以&#xff0c;熟悉操作数据流和数据库&#xff0c;对于每一个开发者来说都是很重要的&#xff0c;今天就…