设计模式:一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结;
***********************************单例模式************************************
***********************单例模式分为懒汉模式和饿汉模式*****************************
一、单例模式Singleton
①应用场景:只需要该类的一个实例对象;则该类的设计就可以采用单例模式进行设计;
②作用:保证整个应用程序有且只有该类的一个实例对象;
③分类:懒汉模式、饿汉模式
④懒汉模式设计示例:
public class SingletonLazy{
//将无参构造函数的访问属性设置为私有;
//保证了外部不可以通过new调用构造函数进行对象的创建;
//只能通过本类提供了全局访问接口getInstance()静态方法来获取实例对象
private SingletonLazy(){
}
//将该类的一个对象变量声明为该类的静态域并且访问属性为私有;
//保证了外部不可以通过该类调用该数据域,只能由本类的静态方法对其进行操作;
private static SingltonLazy singleton;//默认初始值为null,懒汉模式
//单例模式的单例实现的关键,提供静态方法getInstance实现外部获取该类的唯一实例变量;
//方法访问属性必须为公有,保证外部可以通过类名调用该方法;
//设置为静态方法,是因为外部无法自己创建对象实例,构造函数不可调用,所以只能通过这个类的静态方法提供实例;
public static SingletonLazy getInstance()
{
if(singleton == null)
{
singleton = new SingletonLazy();
}
return singleton;
}
}
⑤饿汉模式设计示例:
public class SingletonHungry
{
//将无参构造函数的访问属性设置为私有,保证了外部不可以通过new关键字调用构造函数进行对象的创建;
private SingletonHungry(){}
//将该类的一个对象变量声明为该类的静态域并对其进行赋值,访问属性为私有,保证了外部不可以通过该类调用该数据域;
private static SingletonHungry singleton = new SingletonHungry();//默认初始值为对象实例,饿汉模式
//单例模式的单例实现的关键,提供该方法实现外部获取该类的唯一实例变量;该方法访问属性必须为公有,保证该类可以通过类名调用该方法;
//设置为静态方法,是因为外部无法自己创建对象实例,构造函数不可调用,所以只能通过这个类的静态方法提供实例;
public static SingletonHungry getInstance()
{
return singleton;
}
}
⑥两种单例模式的区别:
饿汉模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,因为在类加载时创建实例对象;线程安全,因为实例对象在调用getInstance()方法之前就已经创建完毕,所以多个线程并发调用getInstance()方法只会获取实例对象,而不会创建对象;
懒汉模式的特点是加载类时比较快,但运行时获取对象的速度比较慢,因为只有在使用该类的静态方法getInstance()时才创建实例;线程不安全,因为多个线程并发调用getInstance()方法时,可能会导致多次创建实例,造成不必要的内存浪费!