一、单例模式概念
单例模式是设计模式中比较简单的一种。适合于一个类只有一个实例的情况,比如窗口管理器,打印缓冲池和文件系统,
它们都是原型的例子。典型的情况是,那些对象的类型被遍及一个软件系统的不同对象访问,因此需要一个全局的访问
指针,这便是众所周知的单例模式的应用。当然这只有在你确信你不再需要任何多于一个的实例的情况下。
单例模式的用意在于前一段中所关心的。通过单例模式你可以:
1、确保一个类只有一个实例被建立
2、提供了一个对对象的全局访问指针
3、在不影响单例类的客户端的情况下允许将来有多个实例
二、单例模式分类
经典的单例模式有两种,懒汉式、饿汉式懒汉式的优点是:写起来比较简单,而且不存在多线程同步问题,避免了synchronized所造成的性能问题;缺点是:初始化类的时候就需要构造实例,(即便你还没有用到这个实例),因此在某些特定条件下会耗费内存。
饿汉式的优点是:只有第一次用到的时候才进行初始化,故在还没用到的时候,会省内存; 缺点是:需要用synchronized关键字进行锁的控制,性能会差一些,代码写起来麻烦些。
三、两种单例模式实现
懒汉式:
Java代码
public class Singleton {
/*
* 单例模式:单个实例服务于整个应用
* 懒汉式单例:只有在第一次请求实例的时候创建,并且只在第一次创建后,以后不再创建该类的实例
*/
// 1.一个私有的指向自己的静态变量
private static Singleton instance;
// 2.私有的构造方法,保证不能从外部创建对象
private Singleton(){}
// 3.公开的静态工厂方法,返回该类的唯一实例(当发现没有实例没有初始化的时候才初始化)
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
System.out.println("创建Singleton类的实例");
}else {
System.out.println("实例已经创建,不能再创建");
}
return instance;
}
}
// 测试类
class Test{
public static void main(String[] args) {
Singleton s = Singleton.getInstance();
System.out.println(Singleton.getInstance());
System.out.println(Singleton.getInstance());
System.out.println(Singleton.getInstance());
}
}
饿汉式:
Java代码
public class Singleton2 {
/*
* 恶汉单例模式:在类加载的时候就创建一个单例模式.
*/
// 1.私有的构造函数,确保不能在类的外部访问该类的构造函数
private Singleton2(){
System.out.println("构造函数执行了");
}
// 2.私有的唯一的静态实例变量,在类加载的时候就创建好单例对象
private final static Singleton2 instance = new Singleton2();
// 3.公开的静态工厂返回此类的唯一实例
public static Singleton2 getInstance(){
return instance;
}
}
// 测试类
class Test2{
public static void main(String[] args) {
Singleton2 s = Singleton2.getInstance();
System.out.println(s);
Singleton2 s2 = Singleton2.getInstance();
System.out.println(s2);
System.out.println(Singleton2.getInstance());
System.out.println(Singleton2.getInstance());
}
}