文档章节

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语言中单例模式的四种写法

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

相见欢
2013/02/03
0
20
设计模式15——Template Method设计模式

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

小米米儿小
2014/01/24
0
0
为什么我墙裂建议大家使用枚举来实现单例。

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

06/10
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
Java并发编程中的设计模式解析(二)一个单例的七种写法

Java单例模式是最常见的设计模式之一,广泛应用于各种框架、中间件和应用开发中。单例模式实现起来比较简单,基本是每个Java工程师都能信手拈来的,本文将结合多线程、类的加载等知识,系统地...

leoliu168
11/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jquery通过id显示隐藏

var $div3 = $('#div3'); 显示 $div3.show(); 隐藏 $div3.hide();

yan_liu
今天
3
0
《乱世佳人》读书笔记及相关感悟3900字

《乱世佳人》读书笔记及相关感悟3900字: 之前一直听「荔枝」,后来不知怎的转向了「喜马拉雅」,一听就是三年。上班的时候听房产,买房了以后听装修,兴之所至时听旅行,分手后听亲密关系,...

原创小博客
今天
3
0
大数据教程(9.6)map端join实现

上一篇文章讲了mapreduce配合实现join,本节博主将讲述在map端的join实现; 一、需求 实现两个“表”的join操作,其中一个表数据量小,一个表很大,这种场景在实际中非常常见,比如“订单日志...

em_aaron
今天
3
0
cookie与session详解

session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时...

士兵7
今天
3
0
十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部