原始单例模式

 1 package com.shejimoshi.create.Singleton;
 2
 3
 4 /**
 5  * 功能:保证一个类仅有一个实例,并提供一个访问它的全局访问点
 6  * 适用:1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问他的时候
 7  *    :2、当这个唯一实例应该是通过子类化可以扩展的,并且可以应该无需更改代码就能使用一个扩展实例时
 8  *    单例模式基础版
 9  * 时间:2016年2月15日下午7:59:47
10  * 作者:cutter_point
11  */
12 public class Singleton
13 {
14     //构造函数私有化
15     private Singleton(){}
16     //数据成员单例
17     private static Singleton single = null;
18
19     //这个就是返回一个单例
20     public static Singleton getInstance()
21     {
22         if(single == null)
23             single = new Singleton();
24
25         return single;
26     }
27 }

单例模式之多线程单例

 1 package com.shejimoshi.create.Singleton;
 2
 3
 4 /**
 5  * 功能:保证一个类仅有一个实例,并提供一个访问它的全局访问点
 6  * 适用:1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问他的时候
 7  *    :2、当这个唯一实例应该是通过子类化可以扩展的,并且可以应该无需更改代码就能使用一个扩展实例时
 8  *    单例模式之多线程单例
 9  * 时间:2016年2月15日下午8:05:41
10  * 作者:cutter_point
11  */
12 public class Singleton2
13 {
14     //构造函数私有化
15     private Singleton2(){}
16     //数据成员单例
17     private static Singleton2 single = null;
18
19     //这个就是返回一个单例,这里加锁为了同步
20     public static synchronized Singleton2 getInstance()
21     {
22         if(single == null)
23             single = new Singleton2();
24
25         return single;
26     }
27 }

单例模式之双重锁保证同步

 1 package com.shejimoshi.create.Singleton;
 2
 3
 4 /**
 5  * 功能:保证一个类仅有一个实例,并提供一个访问它的全局访问点
 6  * 适用:1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问他的时候
 7  *    :2、当这个唯一实例应该是通过子类化可以扩展的,并且可以应该无需更改代码就能使用一个扩展实例时
 8  *    单例模式之双重锁保证同步
 9  * 时间:2016年2月15日下午8:06:55
10  * 作者:cutter_point
11  */
12 public class Singleton3
13 {
14     //构造函数私有化
15     private Singleton3(){}
16     //数据成员单例
17     private static Singleton3 single = null;
18
19     //这个就是返回一个单例,这里加锁为了同步
20     public static Singleton3 getInstance()
21     {
22         if(single == null)
23         {
24             //这里上锁等待同步
25             synchronized(Singleton3.class)
26             {
27                 if(single == null)
28                 {
29                     //这里加一个判断是为了避免在上锁的时候其他线程创建了相应的实例,所以这里再判断一次
30                     single = new Singleton3();
31                 }//if
32             }
33         }
34
35         return single;
36     }
37 }

单例模式之静态内部类

 1 package com.shejimoshi.create.Singleton;
 2
 3
 4 /**
 5  * 功能:保证一个类仅有一个实例,并提供一个访问它的全局访问点
 6  * 适用:1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问他的时候
 7  *    :2、当这个唯一实例应该是通过子类化可以扩展的,并且可以应该无需更改代码就能使用一个扩展实例时
 8  *    单例模式之静态内部类
 9  * 参考:http://www.blogjava.net/kenzhh/archive/2013/03/15/357824.html
10  * 时间:2016年2月15日下午8:09:47
11  * 作者:cutter_point
12  */
13 public class Singleton4
14 {
15     //静态类部类,java静态内部类只有在加载内部类的时候才初始化,所以这种实现方式可以实现懒加载
16     private static class SingletonHolder
17     {
18         private static final Singleton4 INSTANCE = new Singleton4();
19     }
20
21     //构造函数私有化
22     private Singleton4(){}
23
24     public static final Singleton4 getInstance()
25     {
26         return SingletonHolder.INSTANCE;    //也就是说只有在调用这个的时候才进行初始化,然后以后在生存周期内都是这个引用
27     }
28 }

测试代码:

 1 package com.shejimoshi.create.Singleton;
 2
 3
 4 /**
 5  * 功能:保证一个类仅有一个实例,并提供一个访问它的全局访问点
 6  * 适用:1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问他的时候
 7  *    :2、当这个唯一实例应该是通过子类化可以扩展的,并且可以应该无需更改代码就能使用一个扩展实例时
 8  * 时间:2016年2月15日下午8:29:05
 9  * 作者:cutter_point
10  */
11 public class Test
12 {
13
14     public static void main(String[] args)
15     {
16         Singleton s1 = Singleton.getInstance();
17         Singleton s2 = Singleton.getInstance();
18
19         if(s1 == s2)
20         {
21             System.out.println("s1和s2相同");
22         }
23
24         Singleton2 s3 = Singleton2.getInstance();
25         Singleton2 s4 = Singleton2.getInstance();
26
27         if(s3 == s4)
28         {
29             System.out.println("s3和s4相同");
30         }
31
32         Singleton3 s5 = Singleton3.getInstance();
33         Singleton3 s6 = Singleton3.getInstance();
34
35         if(s5 == s6)
36         {
37             System.out.println("s5和s6相同");
38         }
39
40         Singleton4 s7 = Singleton4.getInstance();
41         Singleton4 s8 = Singleton4.getInstance();
42
43         if(s7 == s8)
44         {
45             System.out.println("s7和s8相同");
46         }
47     }
48
49 }

结果:

1 s1和s2相同
2 s3和s4相同
3 s5和s6相同
4 s7和s8相同

转载于:https://www.cnblogs.com/cutter-point/p/5191286.html

【设计模式】5、单例模式相关推荐

  1. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  2. C#设计模式(1)——单例模式

    原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...

  3. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

  4. java单例模式的七种写法_Java设计模式之单例模式的七种写法

    什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...

  5. go设计模式之单例模式

    在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...

  6. 一篇博客读懂设计模式之---单例模式

    一篇博客读懂设计模式之---单例模式 一.  单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...

  7. Java 设计模式(3)单例模式

    前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自 ...

  8. socket可以写成单例嘛_精读设计模式 Singleton 单例模式

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  9. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  10. 实践GoF的设计模式:单例模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:单例模式>,作者: 元闰子. 简述 GoF 对单例模式(Singleton)的定义如下: Ensure a class onl ...

最新文章

  1. mxnet中symbol的网络结构输出(参数维度,和每层输出维度)
  2. tensorflow在训练和验证时监视不同的summary的操作
  3. IDEA启动自动进入最后一个项目
  4. Android studio导入support-v4.jar
  5. 从基于Maven的Web应用程序获取版本字符串
  6. java poi 导入日期为空
  7. 大学生计算机基础清考试卷,天大《计算机网络基础》4月毕业清考作业考核试题模板.doc...
  8. Cosmos OpenSSD--greedy_ftl1.2.0(二)
  9. 分布式锁--Redis实现
  10. Toolbar的困惑
  11. 看小龙哥演讲之感悟!
  12. DoIP(二)——报文类型
  13. 机器学习种9种常用算法
  14. 服务器 磁盘阵列数据恢复案例之:RAID6三块磁盘离线数据恢复过程
  15. Redis之SDS数据结构
  16. Win10 全屏截图快捷键
  17. 如何给图片添加黑色边框
  18. e5 2680v3和e5 2682v4有什么区别
  19. outlook qr码在哪里_原平防伪溯源码_橙程(北京)科技有限公司
  20. 手机图片中文翻译为英文

热门文章

  1. BUUCTF Web [ACTF2020 新生赛]Exec
  2. 关于高效、高质和高产
  3. ****** 四 ******、软设笔记【数据结构】-排序、插入排序、选择排序
  4. 【云周刊】第120期:麒麟来了!PUE逼近1.0,阿里展示液冷黑科技
  5. 【计算机本科补全计划】王道单科--栈的实现以及一些性质
  6. 广义动量定理之质量m的应用案例分析
  7. Java 中import的用法,以及类的种类
  8. python 打印皮卡丘_Python干掉了97%的办公软件?
  9. 备战2020年双十一,刷喵币靠这一个自动化脚本就够了!
  10. 今日恐慌与贪婪指数为66 贪婪程度有所缓解