文档章节

java单例模式的写法

 江上湖人
发布于 2016/11/18 23:22
字数 802
阅读 11
收藏 0
点赞 0
评论 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
上饶
为什么我墙裂建议大家使用枚举来实现单例。

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

⋅ 06/10 ⋅ 0

java开发中的常用的设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

qq_38024548 ⋅ 05/28 ⋅ 0

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗 ⋅ 05/08 ⋅ 0

Java 设计模式 之 单例模式 Singleton 实际应用

Java 设计模式 之 单例模式 Singleton 实际应用 http://www.verejava.com/?id=16998954233354

verejava ⋅ 05/24 ⋅ 0

Java篇-接口interface关键字

一 : interface关键字 接口是与类并行的一个概念 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,...

TianTianBaby223 ⋅ 04/24 ⋅ 0

Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei ⋅ 05/26 ⋅ 0

【唯品会】设计模式在特卖会的应用与思考

设计模式在特卖会的应用与思考 无心之心,道之所存 --《建筑的永恒之道》 1、开篇 之所以讨论设计模式,是因为当前我们都明白它可以提供优雅的解决方案,有利于在团队项目中建立共识,并且无...

暗夜在火星 ⋅ 2016/11/12 ⋅ 0

Decorator设计模式的实现中 装饰设计模式学习笔记

装饰设计模式 a)当某个类的某个方法不适应当前业务的需要 思路: 》扩展父类的可供扩展的方法,可以使有,但不优 》装饰设计模式(推荐) 开发步骤: 5)对于满足需求的方法,直接调用被包装的对...

知止内明 ⋅ 04/19 ⋅ 0

Java设计模式之单例设计模式

Java单例设计模式,有多种实现方式,下面介绍一下比较著名的一些实现方式 饿汉式 这种设计模式简单,且没有多线程安全问题,一般实际开发时选用这种方式。 class HungeryDemo{private Hunger...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

详解Proxy代理模式的场景分析

代理模式是一个十分优秀的软件架构模式,许多应用都用到了代理模式。代理模式就是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不合适或者不能直接引用另一个对象,...

Java架构 ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Day 17 vim简介与一般模式介绍

vim简介 vi和Vim的最大区别就是编辑一个文件时vi不会显示颜色,而Vim会显示颜色。显示颜色更便于用户编辑,凄然功能没有太大的区别 使用 yum install -y vim-enhanced 安装 vim的三种常用模式...

杉下 ⋅ 51分钟前 ⋅ 0

【每天一个JQuery特效】根据可见状态确定是否显示或隐藏元素(3)

效果图示: 主要代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>根据可见状态确定 是否显示或隐藏元素</title><script src="js/jquery-3.3.1.min.js" ty......

Rhymo-Wu ⋅ 今天 ⋅ 0

OSChina 周四乱弹 —— 初中我身体就已经垮了,不知道为什么

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @加油东溪少年 :下完这场雨 后弦 《下完这场雨》- 后弦 手机党少年们想听歌,请使劲儿戳(这里) @马丁的代码 :买了日本 日本果然赢了 翻了...

小小编辑 ⋅ 今天 ⋅ 12

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部