文档章节

单例设计模式

 码农屌丝
发布于 2018/10/18 17:07
字数 1347
阅读 8
收藏 0

 

单例设计模式

  1. 设计模式介绍与代码编写

    在编写程序时经常会遇到一些典型的问题或需要完成某种特定需求.设计模式就是针对这些问题和需求.在大量的实践中总结和理论化之后的代码结构.编程风格以及解决问题的思考方式.设计模式就像经典的棋局. 不同的棋谱,我们用不同的棋局.免得自己再去思考和摸索.

单例模式是Java中的一种设计模式,它是指在设计一个类时,需要保证在整个程序运行期间针对该类只存在一个实例对象. 作用: 限制对象的创建.

 

 

问题1 : 对象中到底有什么属性(存储数据) , 行为(操作数据).

问题2 : 程序中为什么要限定的对象的创建呢 ?

 

 

  1. class SingleDemo
  2. {
  3.        public static void main(String[] args)
  4.        {
  5.               Singleton s1 = Singleton.getInstance();
  6.               Singleton s2 = Singleton.getInstance();
  7.               boolean result = s1 == s2;
  8.               System.out.println("result="+result);
  9.  
  10.               /*
  11.               Singleton s1 = new Singleton();
  12.               Singleton s2 = new Singleton();
  13.               boolean result = s1 == s2;
  14.               System.out.println("result="+result);
  15.               */
  16.        }
  17. }
  18.  
  19. // 定义一个单例类
  20. class Singleton
  21. {
  22.        // 1. 自己创建一个对象
  23.        // 静态变量特点: 内存中仅有一份,能够被该类的所有实例对象所共享.
  24.        private static Singleton INSTANCE = new Single();
  25.        // 2. 构造方法 (私有化)
  26.        private Singleton()
  27.        {
  28.       
  29.        }
  30.        // 3. 提供一个返回该对象的静态方法
  31.        public static Singleton getInstance()
  32.        {
  33.               return INSTANCE; // 返回自己在本类中创建好的实例对象
  34.        }
  35. }

 

 运行结果可以看出.变量 s1 和 s2 值相等.这说明变量 s1 和 s2 引用同一个对象.也就是说两次调用 getInstance() 方法获得的是同一个对象.而 getInstance() 方法是获得 Single 实例对象的唯一途径.因此 Single 类是一个单例的类.

 

 

2. 单例设计模式具备如下特点 :

1. 类中的构造方法使用 private 关键字修饰,声明为私有.这样就不能在类的外部使用 new 关键字来创建实例对象了.

  1. 在类的内部创建一个该类的实例对象,并使用静态变量 INSTANCE 引用该对象,由于变量应该禁止外界直接访问,因此使用 private 修饰.声明为私有成员.
  2. 为了让类的外部能够获取类的实例对象,需要定义个静态方法 getInstance (); 用于返回该类实例 INSTANCE, 由于方法是静态的.外界可以通过 "类名.方法名();" 的方法来访问. -> Single.getInstance();

 

 

3. 多学一招 : final单例 :

 

特点: 单例实现的两步曲.

 

单例模式也可以写成如下形式 : 使用 final 修饰可以实现. 但是如果提供一个公共方法,那么方法内部还可以做一些逻辑判断.

 

  1. /*
  2.        多学一招 : 两步实现单例设计模式
  3.        1. 私有化构造方法
  4.        2. 在本类的内部创建一个对象,使用public修饰,并静态化该变量,
  5.           并需要使用 final 关键字对INSTANCE变量进行最终化,表示该变量不能够再次被修改.
  6. */
  7. class Demo
  8. {
  9.        public static void main(String[] args)
  10.        {
  11.               // 根据Single类创建对象
  12.               Singleton s1 = Singleton.INSTANCE;
  13.               Singleton s2 = Singleton.INSTANCE;
  14.               Singleton s3 = Singleton.INSTANCE;
  15.               Singleton s4 = Singleton.INSTANCE;
  16.  
  17.               // error: cannot assign a value to final variable INSTANCE
  18.               // 如果Single类的INSTANCE属性使用final进行,下一句代码将报语法错误!
  19.               Singleton.INSTANCE = null;
  20.  
  21.               boolean result = s1 == s2;
  22.               System.out.println("result="+result);
  23.               boolean result2 = s3 == s4;
  24.               System.out.println("result2="+result2);
  25.  
  26.               // Java中规定,不能对空对象进行操作.
  27.               // NullPointerException
  28.               Singleton s5 = Singleton.INSTANCE;
  29.               s5.show();
  30.        }
  31. }
  32.  
  33. // 设计一个 `单例类`
  34. class Singleton
  35. {
  36.        // 属性
  37.        private Singleton () {}
  38.  
  39.        public static final Singleton INSTANCE = new Singleton ();
  40.  
  41.        public void show()
  42.        {
  43.               System.out.println("show...");
  44.        }
  45. }

 

 

  1. 懒汉式和饿汉式单例

饿汉式单例 :

特点: 不管你单例对象什么时候用,类一加载,我就直接在堆区中先来创建这个单例对象.

  1. class Demo
  2. {
  3.        public static void main(String[] args)
  4.        {
  5.               Singleton s1 = Singleton.getInstance();
  6.               Singleton s2 = Singleton.getInstance();
  7.               System.out.println(s1 == s2);
  8.        }
  9. }
  10.  
  11. class Singleton
  12. {
  13.        // 1. 创建一个本类的对象
  14.        private static Singleton INSTANCE = new Singleton (); // 静态成员变量,跟随类的加载而加载. 该对象在类加载的时候就被创建完成了.
  15.        // 2. 私有化构造方法
  16.        private Singleton () {}
  17.        // 3. 提供一个共有方法来返回该类的对象
  18.        public static Singleton getInstance()
  19.        {
  20.               return INSTANCE;
  21.        }
  22. }

 

懒汉式单例 :

  特点: 在类加载的时候,不会在堆区中创建单例对象.

  1. class Demo
  2. {
  3.        public static void main(String[] args)
  4.        {
  5.               Singleton s1 = Singleton.getInstance();
  6.               Singleton s2 = Singleton.getInstance();
  7.               System.out.println(s1 == s2);
  8.        }
  9. }
  10.  
  11. class Singleton
  12. {
  13.        // 1. 创建一个本类的对象
  14.        private static Singleton INSTANCE = null; // 类加载的时候不创建对象.
  15.        // 2. 私有化构造方法
  16.        private Singleton () {}
  17.        // 3. 提供一个共有方法来返回该类的对象
  18.        public static Singleton getInstance()
  19.        {
  20.               if (INSTANCE == null)
  21.               {
  22.                     INSTANCE = new Singleton ();
  23.               }
  24.               return INSTANCE;
  25.        }
  26. }

 

特点 : 单例对象什么时候用,我就什么时候来创建.

假设main方法有1000行代码,如果在第800行代码(getInstance())用到了单例,此时前800行代码运行时,不会在堆区中创建单例对象,但是当运行到第800行代码时,才会开始在堆区中来创建单例对象.

 

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 集合
下一篇: BeanUtils
粉丝 0
博文 85
码字总数 208199
作品 0
私信 提问
Java程序员从笨鸟到菜鸟之(三十三)大话设计模式(三)单例模式

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 单例模式属于对象创建型模式,其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。对一些类来说...

长平狐
2012/11/12
120
0
23种设计模式(1):单例模式

定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 类型:创建类模式 类图: 类图知识点: 1.类图分为三部分,依次是类名、属性、方法 2.以<<开头和以>>结尾的为注释...

LCZ777
2014/07/05
0
0
设计模式1——Singleton设计模式

Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序运行生命周期中,使用了单例模式的类只能有一个实例对象存在。单例模式实现了类似C语言中全局变量的功能,单例模式常用于注册...

小米米儿小
2013/12/05
0
0
【23种设计模式之一】单例设计模式(翻译)

引言: 这一系列文章,翻译自网络上的文章,不过中间会夹杂着个人的理解,非原创,不过中文应该算是原创。 下面介绍,使用设计模式的一些好处: 1、设计模式是已经在工业生产中使用的,用于解...

敲代码猥琐男
2015/01/13
0
2
为什么java中用枚举实现单例模式会更好

枚举单例是java中使用枚举提供一个实例对象来实现单例模式的一种新方法,虽然单例模式在java中早已存在,但枚举单例实际上从java5引入枚举作为它的关键特性之后相对来说还是一个新的概念,这...

zhoujy
2013/06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

node调用dll

先安装python2.7 安装node-gyp cnpm install node-gyp -g 新建一个Electron-vue项目(案例用Electron-vue) vue init simulatedgreg/electron-vue my-project 安装electron-rebuild cnpm ins......

Chason-洪
今天
3
0
eclipse中项目svn转gitLab全过程

在工作中,我们可能会遇到项目从svn迁移到gitLab;此过程我们需要变化版本管理工具,上传代码。本篇博客记录了使用spring tool suit(sts/eclipse)进行项目迁移的全过程。 步骤: (1)端口之...

em_aaron
今天
3
0
scala学习(一)

学习Spark之前需要学习Scala。 参考学习的书籍:快学Scala

柠檬果过
今天
1
0
通俗易懂解释网络工程中的技术,如STP,HSRP等

导读 在面试时,比如被问到HSRP的主备切换时间时多久,STP几个状态的停留时间,自己知道有这些东西,但在工作中不会经常用到,就老是记不住,觉得可能还是自己基础不够牢固,知识掌握不够全面...

问题终结者
昨天
4
0
看了一下Maven的内容

了解了Maven其实是一个跨IDE的标准构建工具,能推广的原因估计是借了仓库的便利。 另一个作用是可以通过Maven的功能在社区版的IDEA去创建Web项目,下次实践看看

max佩恩
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部