设计模式可以说是前辈们总结的代码编写精髓;值得我们细细品味,多多学习,当然仅仅学习,是不够的。要想掌握到精髓,需要多多使用,能灵活的正确使用到我们的项目中,才算真正的学会了。下面我们来介绍设计模式中最最基础的设计模式之一单例模式的三种单例模式的实现方式;
一、饿汉式
/**
* 饿汉-单例模式
*/
public class Singleton1 {
//1.定义私有静态变量,类型为类类型
//直接创建好对象,不论到底会用到用不到,故称为饿汉式
private static Singleton1 instance = new Singleton1();
//2.定义私有构造函数
private Singleton1(){
}
//3.定义公共静态方法,返回私有静态变量
public static Singleton1 getInstance(){
return instance;
}
}
二、懒汉式
/**
* 懒汉-单例模式
*/
public class Singleton2 {
//1.定义私有静态变量,类型为类类型,
// 先不创建,等用到时再创建(正是由于等用到时才创建,故而才称为懒汉式)
private static Singleton2 instance = null;
//2.定义私有构造函数
private Singleton2(){
}
//3.定义公共静态方法,返回私有静态变量
// public static Singleton2 getInstance(){//线程不安全的
public static synchronized Singleton2 getInstance(){// 线程安全,通过synchronize保证线程安全
if(instance == null){
instance = new Singleton2();
}
return instance;
}
}
三、静态内部类
/**
* 内部类创建方式-单例模式
* 这种方式是线程安全的
*/
public class Singleton3 {
//1.定义静态内部类,类里面有静态内部属性,为类类型
private static class SingletonInnerClass{
private static final Singleton3 instance = new Singleton3();
}
//2.定义私有构造函数
private Singleton3(){
}
//3.定义公共静态方法,返回内部类的静态常量
public static Singleton3 getInstance(){
return SingletonInnerClass.instance;
}
}
总结:三种方式的区别:
饿汉式:效率高,线程安全,但浪费内存;不管对象是否真的用到,都直接创建完成;
懒汉式:效率低,线程不安全,需要通过synchronize来保证线程安全;
内部类式:效率高,线程安全;
抛砖引玉:
除了这三种方式之外,还有 枚举实现方式;有兴趣着可以研究下;以上三种方式,虽然构造模式为私有的,外部不可以直接调用,但是通过反射和序列化依然可以绕过这个,创建出多个单例对象;而枚举实现单例模式,则可以避免这两种情况;