《Java中的单例模式--两种》

  1 //单例模式:饿汉式和懒汉式
  2 //单例模式
  3
  4 /*
  5 设计模式:解决某一类问题行之有效的解决办法(思想)。
  6 单例(Singleton):设计模式:
  7 学习设计模式必须先弄清楚它是解决什么问题的。
  8
  9 单例模式是解决什么问题的?
 10 可以保证一个类的对象唯一性。
 11
 12 场景:比如多个程序都要使用一个配置文件中的数据,而且要实现
 13       数据共享和交换。必须要将多个数据封装到一个对象中。而且
 14       多个程序操作的是同一个对象。那也就是说必须保证这个配置
 15       文件的唯一性。
 16
 17 怎么能保证对象的唯一性呢?
 18 1,一个类只要提供了构造函数就可以产生多个对象,
 19   完全无法保证唯一。
 20 既然数量不可控,干脆,不让其他程序建立对象。
 21
 22 2,不让其他程序创建对象,对像何在?
 23    干脆,自己在本类中创建一个对象,这样好处是什么,可控!.
 24
 25 3,创建完成后,是不是要给其他程序提供访问的方式。
 26
 27 怎么实现这个步骤呢?
 28 1,怎么就能不让其他程序创建对象呢?
 29     直接私有化构造函数。不让其他程序创建的对象初始化,这样其他程序就
 30     不能创建对象了,但是在卑劣中还是可以创建本类对象的。
 31 2,直接在本类中new一个本类对象。
 32 3,定义一个功能,其他程序可以通过这个功能获取到本类的对象。
 33 */
 34 //代码体现。
 35
 36 //【调用方法时,对象已经产生了】
 37 //饿汉式。
 38  class Single
 39 {
 40     //私有化构造函数。
 41     private Single(){}
 42
 43     //2,创建一个本类对象。
 44     private static /*final*/ Single s = new Single();//因为getInstance方法是
 45                                     //静态的,所以这个方法只能
 46                                     //访问静态的,所以这里必须
 47                                     //加静态关键字修饰。
 48                                     //因为这个对象s是静态的,可以由其他
 49                                     //程序直接有类名调用,但是这样不安全,
 50                                     //对象不可控,所以为了不让其他程序直接
 51                                     //通过类名的方式来调用,加了private
 52                                     //关键字。
 53
 54     //3,定义一个方法返回这个对象。
 55     public static Single getInstance(int x)
 56     {
 57         //因为这个方法是要返回一个对象,
 58         //就是为了让其他程序获取这个对象的
 59         //所以这个方法的权限要足够大,所以
 60         //为public的。
 61         if(x<0)
 62             return s;
 63         else
 64             return null;
 65     }
 66 }
 67
 68 //单例的延迟加载方式。(单例:单独的对象)【拿到方法的时候,才产生对象】
 69 //懒汉式。
 70 class Single2
 71 {
 72     private static Single2 s2 = null;
 73
 74     private Single2(){}//私有化构造函数。
 75
 76     public static Single2 getInstance()
 77     {
 78         if(s2==null)
 79             s2 = new Single2();
 80         return s2;
 81     }
 82 }
 83
 84
 85 class SingleDemo
 86 {
 87     public static void main(String[] args)
 88     {
 89         //要想获取Single的对象,调用geiInstance方法,
 90         //既然无法通过对象调用,只能用类名调用,那么
 91         //这个方法必须是静态的
 92
 93         Single ss = Single.getInstance(2);
 94         Single ss2 = Single.getInstance(3);
 95         System.out.println(ss == ss2);//返回true,可以知道ss 和 ss2 指向同一个对象。
 96
 97         Single2 s = Single2.getInstance();
 98         Single2 s1 = Single2.getInstance();
 99         System.out.println(s == s1);//返回true,可以知道s 和 s1 指向同一个对象。
100     }
101 }
102
103 /*
104 在饿汉式中可以在本类中创建本类对象时加入final关键字,但是在
105 懒汉式中不可以,试分析其原因。
106 */
时间: 2025-01-06 15:32:21

《Java中的单例模式--两种》的相关文章

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

IOS测试框架之:athrun的InstrumentDriver源码阅读笔记

athrun的InstrumentDriver源码阅读笔记 作者:唯一 athrun是淘宝的开源测试项目,InstrumentDriver是ios端的实现,之前在公司项目中用过这个框架,没有深入了解,现在回来记录下. 官方介绍:http://code.taobao.org/p/athrun/wiki/instrumentDriver/ 优点:这个框架是对UIAutomation的java实现,在代码提示.用例维护方面比UIAutomation强多了,借junit4的光,我们可以通过junit4的

Yii源码阅读笔记 - 日志组件

?使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category);Yii::trace($message, $category); 两者的区别在于后者依赖于应用开启调试模式,即定义常量YII_DEBUG: defined('YII_DEBUG') or define('YII_DEBUG', true); Yii::log方法的调用需要指定message的level和category.category是格式为“xxx.yyy.z

源码阅读笔记 - 1 MSVC2015中的std::sort

大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格式化,去掉或者展开用于条件编译或者debug检查的宏,依重要程度重新排序函数,但是不会改变命名方式(虽然MSVC的STL命名实在是我不能接受的那种),对于代码块的解释会在代码块前(上面)用注释标明. template<class _RanIt, class _Diff, class _Pr> in

CI框架源码阅读笔记5 基准测试 BenchMark.php

上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功能,各模块之间可以相互调用,共同构成了CI的核心骨架. 从本篇开始,将进一步去分析各组件的实现细节,深入CI核心的黑盒内部(研究之后,其实就应该是白盒了,仅仅对于应用来说,它应该算是黑盒),从而更好的去认识.把握这个框架. 按照惯例,在开始之前,我们贴上CI中不完全的核心组件图: 由于BenchMa

CI框架源码阅读笔记2 一切的入口 index.php

上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里这次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1.       设置应用程序环境 define('ENVIRONMENT', 'development'); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch case代码块中

Apache Storm源码阅读笔记

欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比较少,理解起来非常费劲. 尽管自己也陆续对storm的源码走读发表了一些博文,当时写的时候比较匆忙,有时候衔接的不是太好,此番做了一些整理,主要是针对TridentTopology部分,修改过的内容采用pdf格式发布,方便打印. 文章中有些内容的理解得益于徐明明和fxjwind两位的指点,非常感谢.

CI框架源码阅读笔记4 引导文件CodeIgniter.php

到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.com/usr/reg 经过引导文件,实际上会交给Application中的UsrController控制器的reg方法去处理. 这之中,CodeIgniter.php做了哪些工作?我们一步步来看. 1.    导入预定义常量.框架环境初始化 之前的一篇博客(CI框架源码阅读笔记2 一切的入

jdk源码阅读笔记之java集合框架(二)(ArrayList)

关于ArrayList的分析,会从且仅从其添加(add)与删除(remove)方法入手. ArrayList类定义: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Monaco } span.s1 { color: #931a68 } public class ArrayList<E> extends AbstractList<E> implements List<E> ArrayList基本属性: /** *

dubbo源码阅读笔记--服务调用时序

上接dubbo源码阅读笔记--暴露服务时序,继续梳理服务调用时序,下图右面红线流程. 整理了调用时序图 分为3步,connect,decode,invoke. 连接 AllChannelHandler.connected(Channel) line: 38 HeartbeatHandler.connected(Channel) line: 47 MultiMessageHandler(AbstractChannelHandlerDelegate).connected(Channel) line: