文档章节

学习设计模式——单例模式

江左煤郎
 江左煤郎
发布于 10/15 18:15
字数 889
阅读 9
收藏 0

1. 认识单例模式

    1. 定义:一个类中仅有一个实例,并提供一个访问它的全局访问点。

    2. 结构:仅一个Singleton类,其中包含一个static类变量,而类变量的类型就是Singleton类,而且Singleton类的构造方法必须声明为private,通过一个static修饰的getInstance方法使外界来访问这个类的唯一实例。

    3. 参考代码实现:有两种实现方式,一种是懒惰式(延迟加载),一种是饥饿式,懒惰式是以时间换取空间,而饥饿式是以空间换取时间

//饥饿式实现,以空间换时间,即在加载Singleton 类时就已经创建该类的单例对象
public class Singleton {
	//通过static来声明一个Singleton实例对象为类变量,只会创建一次
	private static Singleton s=new Singleton();
	//禁止通过构造方法生成Singleton的实例对象
	private Singleton(){	
	}
	
	public static Singleton getIntance(){
		return s;
	}
	//Singleton类中的其他方法操作
	public void SingletonOperation(){
		System.out.println("Singleton中的操作方法");
	}
	//Singleton类中可以有实例变量
	private int data;
}
//懒惰式单例模式,直到第一次调用getIntance()方法时才生成Singleton2的单例对象
public class Singleton2 {
	//通过static来声明一个Singleton实例对象为类变量,只会创建一次
	private static Singleton2 s=null;
	//禁止通过构造方法生成Singleton的实例对象
	private Singleton2(){	
	}
	public static Singleton2 getIntance(){
		if(s==null){
			s=new Singleton2();
		}
		return s;
	}
	//Singleton类中的其他方法操作
	public void SingletonOperation(){
		System.out.println("Singleton中的操作方法");
	}
	//Singleton类中可以有实例变量
	private int data;	
}

2. 理解单例模式

    1. 功能:保证单例类在运行期间只会被创建一个实例,并为该实例提供一个对外访问的方法。

    2. 范围:单例模式只会在同一个ClassLoader以及其子ClassLoader范围内有效。

    3. 多线程并发情况下的问题:在上面的参考代码中,懒惰式单例模式的实现如果是处于多线程并发情况下调用getInstance方法,就有可能会发生创建多个Singleton实例,也就是说会出现线程不安全现象,原因在于    s=new Singleton2()    该行代码处。所以为了保证线程安全,可以使用synchronized关键字来保证线程安全,但性能可能会不太好,推荐另一种实现方式

//懒惰式单例模式的保证线程安全的实现
public class Singleton3 {
	//通过该静态内部类,就可以实现延迟加载
	/*
	 * 由于该类是静态内部类,Singleton3Holder与Singleton3类并无依赖关系
	 * 也就是说,加载Singleton3类时不会自动加载Singleton3Holder,
	 * 只有调用Singleton3Holder内部的方法或变量时才会加载该类,而且加载只会加载一次,
	 * 所以这就相当于通过jvm的类加载机制来实现了延迟加载并保证了并发安全
	 */
	private static class Singleton3Holder{
		private static Singleton3 s=new Singleton3();
	}
	// 禁止通过构造方法生成Singleton的实例对象
	private Singleton3() {
	}

	public static Singleton3 getIntance() {
		return Singleton3Holder.s;
	}

	// Singleton类中的其他方法操作
	public void SingletonOperation() {
		System.out.println("Singleton中的操作方法");
	}

	// Singleton类中可以有实例变量
	private int data;
}

 

© 著作权归作者所有

共有 人打赏支持
江左煤郎
粉丝 16
博文 68
码字总数 174368
作品 0
西安
后端工程师
私信 提问
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
08/27
0
0
编程中的那些经典套路——设计模式汇总

在正式阅读前,我先谈谈我们该用什么姿势和心态学习设计模式: 如果你还没有过多的编程经验(泛指半年以下),我建议你把它当做小说来看,能看懂多少是多少,因为半年以下经验的程序员用到设...

gzchen
08/27
0
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
11/06
0
0
编程中的那些套路——关于工厂模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 前面我们写了简单工厂模式,《编程中的那些套路——关于简单工厂模式》,但简单工厂模式有一些不足(违反...

gzchen
08/27
0
0
编程中的那些套路——关于单例模式

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

gzchen
08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用POLARDB构建客到智能餐饮系统实践

摘要: 在新零售成为大趋势的今天,餐饮行业也加入到这一浪潮之中。智能餐饮系统将帮助餐饮行业从多个维度提升自己的运营能力和收益,而打造智能餐饮系统SaaS化能力也成为了目前的一个热点。...

阿里云官方博客
36分钟前
2
0
aws S3 util demo

package com.example.demo;import com.amazonaws.AmazonClientException;import com.amazonaws.AmazonServiceException;import com.amazonaws.auth.BasicAWSCredentials;import co......

经常把天聊死的胖子
今天
5
0
linux下查看cpu、memo、io、swap性能数据脚本

直接贴脚本: 1、cpu #!/bin/bashCurrentDate=`date -d today '+%Y%m%d'`CurrentTime=`date -d today '+%Y%m%d%H%M'`mytext="$CurrentTime\t`top -b -n 1 | grep Cpu\(s\......

郑加威
今天
5
0
MySQL之——查询重复记录、删除重复记录方法大全

MySQL之——查询重复记录、删除重复记录方法大全

安小乐
今天
2
0
spring容器启动,停止,关闭事件监听-ApplicationEvent

ApplicationEvent ApplicationEvent相当于一个事件,所有自定义事件都需要继承这个抽象类。在Eclipse中Ctrl+Shift+H调用类的层次结构列表,可以看到如下 Application下抽象子类ApplicationCo...

tantexian
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部