文档章节

java单例模式的写法

 江上湖人
发布于 2016/11/18 23:22
字数 802
阅读 11
收藏 0

单例模式指的是在内存中只有一个对象 ,这样我们想到实现单例模式应该用到static关键字

一  懒汉式单例

先看下面这个类

//懒汉式单例类(我是没明白这个命名是怎么来的 与后面的饿汉式单例 的区别是 实例域初始化的时间)
public class Singleton {
      //私有构造方法  一般构造方法都是public 私有说明不能在这个类的外部实例化这个类  
	  private Singleton(){}
	  private static Singleton single=null;  
	    //静态工厂方法   
	  public static Singleton getInstance(){  
	         if (single == null) {    
	             single = new Singleton();  
	         }    
	        return single;  
	  }   
	  public static void main(String args[])  
	  {  
	        Singleton instance = Singleton.getInstance();  
	        Singleton instance2 = Singleton.getInstance();
	        System.out.println(instance == instance2);
	      
	  }  
	    
}

 首先看到这个类的结构 

 这个类只有一个域 这个域是引用类型 这个域被static 修饰 会在类编译的时候就加载 只不过这个时候是null

 有两个静态方法 另外一个main方法是我测试用的

  打印出的结果是true 说明两个对象是同一个对象

 private Singleton() {};
 
 构造函数 跟类名相同的方法是构造函数 构造函数是用来构造一个类的
 构造函数一般是public 可以在类外调用
 这里变成private 就可以防止在另外一个类里面用new的方式创建了

 我们可以试试在另外一个类里吗调用这个构造函数
 public static void main(String[] args) {
		// TODO Auto-generated method stub
       Singleton singleton = new Singleton();
      
}
编译是报错的
 

我们通过 类名.方法 的方式调用静态类

Singleton.getInstance();
如果实例域是null(第一个调用这个方法)则创建实例域(通过私有构造函数)

二、饿汉式单例

public  class Singleton {
	  private Singleton() {}  
	  private static final Singleton single = new Singleton();  
	    //静态工厂方法   
	  public static Singleton getInstance() {  
	        return single;  
	  }    
	  public static void main(String args[])  
	  {  
        Singleton instance = Singleton.getInstance();  
	    Singleton instance2 = Singleton.getInstance();
	    System.out.println(instance == instance2);
	  }  
	    
}

与上面的懒汉式区别是静态实例域一开始就构造出来了 而懒汉式开始加载的时候是null

也就是饿汉式每次调用时都是同一个对象 类编译的时候就通过new Singleton() 的方式构造出来 而且在后面不可改变

三 静态内部类方式

public class Singleton {
    private Singleton() {//构造函数
	}
    private static  class innerClass{ //静态内部类 编译后就成了一个单独的类 Singleton$innerClass 
    	public static final  Singleton instance = new Singleton() ;
    }
    public static final Singleton getinstance(){
    	return innerClass.instance;	
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Singleton instance = Singleton.getinstance();
		Singleton instance1 = Singleton.getinstance();
		System.out.println(instance == instance1);
	}

}

调用单例的方法同样是 类名.方法 通过内部类的方式调用就是 单例类一开始就构造出来了这跟饿汉式是一样的 只不过是在内部类中构造的 。

这三个例子都只是实现了单例模式的基本结构  在实际开发中我们应当在构造函数中实现更多的方法。

另外 网上有很多关于多线程与单例的讨论 我只知道第二、三种方法构造出来的单例对象在程序中是不能重新改变赋值的 

有朋友了解这方面的问题的可以说下哈

© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 25
码字总数 18450
作品 0
上饶
从 Java 到 Scala (三): object 的应用

本文由 Captain 发表在 ScalaCool 团队博客。 在上篇 Java 到 Scala 系列中,我想你或多或少在语言特性上对有了一定的掌握,在了解完它酷酷的语言特性——让静态回归常态并能简单运用其衍生出...

ScalaCool
09/10
0
0
20个设计模式和软件设计面试问题

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎...

LCZ777
2014/08/13
0
0
Java语言中单例模式的四种写法

作为设计模式理论中的Helloworld,相信学习java语言的人,都应该听说过单例模式。单例模式作为对象的一种创建模式,它的作用是确保某一个类在整个系统中只有一个实例,而且自行实例化并向整个...

相见欢
2013/02/03
0
20
设计模式3——Proxy设计模式

Proxy代理设计模式是一种控制对象访问的设计模式,类似于网络代理,网络代理机制如下图: Proxy代理设计模式机制如下: 代理模式UML图如下: 代理模式顺序图如下: 客户端程序通过代理程序来...

小米米儿小
2013/12/06
0
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 鱼生不值得

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念:分享新裤子的单曲《没有理想的人不伤心 (Remix版)》: 《没有理想的人不伤心 (Remix版)》- 新裤子 手机党少年们想听歌,请使劲儿戳...

小小编辑
23分钟前
9
3
arts-week10

Algorithm 905. Sort Array By Parity - LeetCode Review Who’s Afraid of the Big Bad Preloader? 一文读懂前端缓存 一个网络请求3个步骤:请求,处理,响应,而前端缓存主要在请求处响应这两步...

yysue
今天
4
0
00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
5
1
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
183
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部