单例模式:
是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。
单例模式的要点有三个:(1)是某个类只能有一个实例;
(2)是它必须自行创建这个实例;
(3)是它必须自行向整个系统提供这个实例。从具体实现角度来说,就是以下三点:
(1)单例模式的类只提供私有的构造函数(2)类定义中含有一个该类的静态私有对象
(3)该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
(一)懒汉式
懒汉式的特点是延迟加载,比如配置文件,采用懒汉式的方法,配置文件的实例直到用到的时候才会加载。
代码实现:
package com.jn.pro;
/*
* 懒汉式
*/
public class SingletonClass {
private static SingletonClass instance = null;
private SingletonClass(){
}
/*
* 定义一个公有方法,判断实例是否已经存在,
* 存在则返回实例,否则新建一个再返回
*/
public static synchronized SingletonClass getInstance(){
if(instance == null){
instance = new SingletonClass();
}
return instance;
}
}
测试类:
package com.jn.pro;
/*
* 懒汉式测试类
*/
public class SingletonClassTest {
public static void instantiation(){
SingletonClass sc1 = SingletonClass.getInstance();
System.out.println("第一次取得实例sc1");
SingletonClass sc2 = SingletonClass.getInstance();
System.out.println("第二次取得实例sc2");
if(sc1 == sc2){
System.out.println("sc1和sc2是同一个实例(懒汉式)");
}
}
public static void main(String[] args){
instantiation();
}
}
运行结果:
第一次取得实例sc1
第二次取得实例sc2
sc1和sc2是同一个实例(懒汉式)
(二)饿汉式
饿汉式的特点是一开始就加载了,如果说懒汉式是“时间换空间”,那么饿汉式就是“空间换时间”,因为一开始就创建了实例,所以每次用到之后直接返回就好了。
代码实现:
package com.jn.pro;
/*
* 饿汉式
*/
public class SingletonClass1 {
private static final SingletonClass1 instance = new SingletonClass1();
private SingletonClass1(){
}
public static SingletonClass1 getInstance(){
return instance;
}
}
测试类:
package com.jn.pro;
/*
* 饿汉式测试类
*/
public class SingletonClassTest1 {
public static void instantiation(){
SingletonClass1 sc1 = SingletonClass1.getInstance();
System.out.println("第一次取得实例");
SingletonClass1 sc2 = SingletonClass1.getInstance();
System.out.println("第二次取得实例");
if(sc1 == sc2){
System.out.println("sc1和sc2是同一个实例(饿汉式)");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
instantiation();
}
}
运行结果:
第一次取得实例
第二次取得实例
sc1和sc2是同一个实例(饿汉式)
注:饿汉式每次调用的时候不用做创建,直接返回已经创建好的实例。这样虽然节省了时间,但是却占用了空间,实例本身为static的,会一直在内存中带着。