单列设计模式,无论在java或是在android中都是比较常用的软件设计模式
单列概念(3个重要要点):
一个类有且紧有一个实例,且自行实例化,并向整个系统提供这个实例;
具体体现在以下三点:
1.单例模式的类只提供私有的构造函数
2.类定义中含有一个该类的静态私有对象
3.该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
优点:
1.单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
2.因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点:
开发人员必须记住自己不能使用new关键字实例化对象。
1.懒汉式(类加载时不需要初始化)
public class Singleton {
//懒汉式单例模式 比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢
private static Singleton sSingleton=null;//静态私用成员,没有初始化
private Singleton(){
//私有构造函数
}
public static synchronized Singleton getSingleInstance(){
if(sSingleton ==null){
sSingleton = new Singleton();
}
return sSingleton;
}
}
2
.饿汉式(在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快)
public class Singleton {
//饿汉单例模式
//在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快
private static Singleton sSingleton = new Singleton();//静态私有成员,已初始化
private Singleton() {
//私有构造函数
}
/**
* //静态,不用同步(类加载时已初始化,不会有多线程的问题)
* @return
*/
public static Singleton getSingleInstance() {
return sSingleton;
}
}
3.双重校验锁
/**
* 双重校验锁
* 这个是懒汉式的升级版,俗称双重检查锁定
*/
public class Singleton {
private volatile static Singleton sSingleton;
private Singleton() {
}
public static Singleton getSingleton() {
if (sSingleton == null) {
synchronized (Singleton.class) {
if (sSingleton == null) {
sSingleton = new Singleton();
}
}
}
return sSingleton;
}
}
关于单例模式跟全局变量的区别
全局变量是一个变量,存在于某个具体的类中,
单列是一个对象,存在整个应用;
example:android中提供网络请求工具类的单列:
public class HttpUtils {
private volatile static HttpUtils instance;
public static HttpUtils getInstance() {
if (instance == null) {
synchronized (HttpUtils.class) {
if (instance == null) {
instance = new HttpUtils();
}
}
}
return instance;
}
}