单例Singleton的“懒汉式”与“饿汉式”实现方法
2016-11-01 15:28
239 查看
所谓“懒汉式”与“饿汉式”的区别,是在与建立单例对象的时间的不同。 “懒汉式”是在你真正用到的时候才去建这个单例对象: 比如:有个单例对象 public class Singleton{ private Singleton(){} private static Singleton singleton = null; //不建立对象 public static synchronized Singleton getInstance(){ if(singleton == null) { //先判断是否为空
singleton = new Singleton (); //懒汉式做法 } return singleton ; }}
“饿汉式”是在不管你用的用不上,一开始就建立这个单例对象:比如:有个单例对象
public class Singleton{ public Singleton(){} private static Singleton singleton = new Singleton(); //建立对象
public static Singleton getInstance(){return singleton ;//直接返回单例对象 }}它有以下几个要素:
私有的构造方法
指向自己实例的私有静态引用
以自己实例为返回值的静态的公有的方法
Singleton 单例模式(懒汉方式和饿汉方式)
单例模式的概念:单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。关键点:1)一个类只有一个实例 这是最基本的2)它必须自行创建这个实例
3)它必须自行向整个系统提供这个实例----------------------------------------------------------------------------------------------------------------------------------------------------
两种实现方式:
1 懒汉模式(类加载时不初始化)
package Singleton; public class LazySingleton { //懒汉式单例模式 //比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢 private static LazySingleton intance = null;//静态私用成员,没有初始化 private LazySingleton() { //私有构造函数 } public static synchronized LazySingleton getInstance() //静态,同步,公开访问点 { if(intance == null) { intance = new LazySingleton(); } return intance; } }
关键点:(代码注释上已给出)
1)构造函数定义为私有----不能在别的类中来获取该类的对象,只能在类自身中得到自己的对象
2)成员变量为static的,没有初始化----类加载快,但访问类的唯一实例慢,static保证在自身类中获取自身对象
3)公开访问点getInstance: public和synchronized的-----public保证对外公开,同步保证多线程时的正确性(因为类变量不是在加载时初始化的)
优缺点见代码注释。
2 饿汉式单例模式(在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快)
package Singleton; public class EagerSingleton { //饿汉单例模式 //在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快 private static EagerSingleton instance = new EagerSingleton();//静态私有成员,已初始化 private EagerSingleton() { //私有构造函数 } public static EagerSingleton getInstance() //静态,不用同步(类加载时已初始化,不会有多线程的问题) { return instance; } }
关键点:(代码注释已写)
1)私有构造函数
2)静态私有成员--在类加载时已初始化
3)公开访问点getInstance-----不需要同步,因为在类加载时已经初始化完毕,也不需要判断null,直接返回
优缺点见代码注释。
--------------------------------------------------------------------------------------------------------------------------------------------------
关于单例模式跟全局变量有什么区别,似乎也可以提供一个public的类变量和一个private的构造函数实现类似的功能。
相关文章推荐
- 单例模式的简单实现与两种实现方法的比较(饿汉式和懒汉式)(一)
- 单例模式的简单实现与两种实现方法的比较(饿汉式和懒汉式)(二)
- 单例模式的三种实现 HungrySingleton(饿汉式) LazySingleton1(懒汉式:方法级锁) LazySingleton2(懒汉式:双检查锁 有BUG)
- Singleton的两种不同实现方法.
- 对Singleton的实现方法做一个总结
- JAVA设计模式——单例(Singleton)模式 多种实现方法
- 多种方法实现singleton
- Singleton(单件)模式的两种实现方法
- C#实现Singleton的两种方法的比较
- C++中实现Singleton的正确方法
- C++中实现Singleton的正确方法
- 单例模式的两种实现方式:懒汉式 饿汉式
- Java单例模式:饿汉式和懒汉式的实现
- Java单例模式:饿汉式和懒汉式的实现
- java用enum实现singleton的方法
- C#中三种Singleton的实现方法
- Singleton在C++中的两种实现方法
- C# “Singleton” 模式四种实现方法
- C++中实现Singleton的正确方法
- C++中实现Singleton的正确方法