文档章节

单例设计模式

 码农屌丝
发布于 10/18 17:07
字数 1347
阅读 6
收藏 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
博文 82
码字总数 202665
作品 0
私信 提问
编程中的那些套路——关于单例模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 在设计模式中,单例模式和工厂模式)可以说是使用的最普遍的设计模式了,所以掌握此种模式尤为重要。 单...

gzchen
08/27
0
0
23种设计模式(1):单例模式

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

LCZ777
2014/07/05
0
0
结合 Android 看看单例模式怎么写

定义及使用场景 定义 单例模式,就是在整个系统中某一个类的实例只有一个,并且自行实例化向整个系统提供;简单来说,就是某个类被实例化的方式是唯一的;同时他它必须向系统自动提供这个实例...

IAM四十二
10/24
0
0
设计模式1——Singleton设计模式

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

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

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

敲代码猥琐男
2015/01/13
0
2

没有更多内容

加载失败,请刷新页面

加载更多

Linux虚拟机安装VmwareTool

1.点击虚拟机: 2.点击安装Vmware-Tools,出现如下界面,将圈起来的拖动到桌面 3.接着打开终端,执行解压缩命令 tar -xzv -f VMwareTools-10.2.5-8068393.tar.gz 这个后面的VMwareTools-10.2....

陈刚生
29分钟前
1
0
Java学习笔记(1) --JSE 、JEE、 JME三者的区别

java SE : java standard edition , JSE。它允许允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的java应用程序。 java SE包含了java Web 服务开发的类,并为java platform ,e...

hellation_
32分钟前
3
0
kafka 环境配置

https://www.cnblogs.com/fly-piglet/p/7762556.html

steel7c4
36分钟前
1
0
关于人工智能的思考

像人类一样可以思考,可以创造的人工智能会出现吗? 个人认为:会出现。但是出现的时间,取决了于硬件架构,和运算架构实现的时候。原因在于,人类智能可以出现,机器智能为什么不可以呢,不...

janl
37分钟前
1
0
破界!Omi生态omi-mp发布,用小程序开发生成Web

omi-mp 是什么 Omi 框架是微信支付线研发部和 AlloyTeam 开源的通用 Web 组件化框架,基于 Web Components,用来开发 PC、手机浏览器或者微信、手Q webview 的 Web 页面。自今年5月开源以来,...

腾讯开源
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部