博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Singleton模式的五种实现
阅读量:5048 次
发布时间:2019-06-12

本文共 1990 字,大约阅读时间需要 6 分钟。

单例模式的特点:

  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其他对象提供这一实例。 -《Java与模式》

单例类可以是没有状态的,仅用做提供工具性函数的对象。既然是提供工具性函数,也就没有必要创建多个实例。

 

下面列举单例模式的几种实现:

  • 单元素的枚举类型实现Singleton – the preferred approach.enum类型是Jdk1.5引入的一种新的数据类型.其背后的基本想法:通过公有的静态final域为每个枚举常量导出实例的类。因为没有可访问的构造器,枚举类型是真正的final。既不能创建枚举类型实例,也不能对它进行扩张 。枚举类型是实例受控的,是单例的泛型化,本质上是氮元素的枚举 -《Effective Java》P129
public enum Singleton{	INSTANCE;	public void execute(){…}	public static void main(String[] agrs){		Singleton sole=Singleton.INSTANCE;		sole.execute();	}}
  • 懒汉式 – Lazy initialization . 构造函数是private,只有通过Singleton才能实例化这个类。
public class Singleton{	private volatile static Singleton uniqueInstance=null;	private Singleton(){}	public static Singleton getInstance(){		if(uniqueInstance==null){			synchronized(Singleton.class){				if(uniqueInstance==null){					uniqueInstance=new Singleton();				}			}		}		return uniqueInstance;	}	//other useful methods here}
  • 饿汉式 – Eager initialization
public class Singleton{	private static Singleton uniqueInstance=new Singleton();	private Singleton(){}	public static Singleton getInstance(){		return uniqueInstance;	}}
  • static block initialization
public class Singleton{	private static final Singleton instance;			static{		try{			instance=new Singleton();		}catch(IOException e){			thronw new RuntimeException("an error's occurred!");		}	}	public static Singleton getInstance(){		return instance;	}	private Singleton(){	}}
  • The solution of Bill Pugh 。- From wiki <Singleton Pattern> 。通过静态成员类来实现,线程安全。
public class Singleton{	//private constructor prevent instantiation from other classes	private Singleton(){}       	/**    *SingletonHolder is loaded on the first execution of Singleton.getInstance()    *or the first access to SingletonHolder.INSTANCE,not befor.    */     private static class SingletonHolder{		public static final Singleton instance=new Singleton();	 }     private static Singleton getInstance(){		return SingletonHolder.instance;	 }}

转载于:https://www.cnblogs.com/matt123/archive/2012/06/26/2564393.html

你可能感兴趣的文章
关于cookie存取中文乱码问题
查看>>
k8s架构
查看>>
select 向上弹起
查看>>
mysql 多表管理修改
查看>>
group by order by
查看>>
bzoj 5252: [2018多省省队联测]林克卡特树
查看>>
https 学习笔记三
查看>>
华为“云-管-端”:未来信息服务新架构
查看>>
基于Sentinel实现redis主从自动切换
查看>>
函数(二)
查看>>
oracle中所有存在不存在的用户都可以使用dba连接到数据库
查看>>
函数式编程思想
查看>>
java安全沙箱(二)之.class文件检验器
查看>>
Oracle学习之简单查询
查看>>
log4j配置
查看>>
linux 配置SAN存储-IPSAN
查看>>
双链表
查看>>
java学习笔记之String类
查看>>
pymysql操作mysql
查看>>
Linux服务器删除乱码文件/文件夹的方法
查看>>