单列模式
一、单列模式有:懒汉模式、饿汉模式、双重锁模式
1、懒汉模式:在第一次请求的时候才创建实例,并且第一次创建后就不能再创建该实例
2、饿汉模式:在类加载的时候就创建实例
3、双重锁模式:双重锁模式其实就是懒汉模式的双重锁模式,也是三种模式中效率最高的模式
二、创建单列模式的步骤:
1、创建一个私有的静态变量
2、创建一个私有的构造方法
3、创建一个公有的静态方法,并返回实例
三、代码示例
1、懒汉模式
package com.singleton;
/**
* 单列模式,懒汉模式,在第一次请求的时候创建实例,并且第一次创建实例后就不能在创建该实例
* @author Administrator
*
*/
public class Singleton1 {
//创建一个私有的静态变量
private static Singleton1 singleton1 = null;
//创建一个私有的构造方法
private Singleton1(){
}
//创建一个共有的静态方法,并返回该实例
public static Singleton1 getSingleton(){
if(singleton1 == null){
singleton1 = new Singleton1();
System.out.println("创建一个Singleton实例");
}else{
System.out.println("已经创建Singletong实例了,不能再创建");
}
return singleton1;
}
//测试
public static void main(String[] args) {
//测试懒汉模式
Singleton1 s = Singleton1.getSingleton();
System.out.println("第一次--->" + s);
System.out.println("第二次--->" + Singleton1.getSingleton());
System.out.println("第三次--->" + Singleton1.getSingleton());
}
}
2、饿汉模式
package com.singleton;
/**
* 单列模式,饿汉模式,类加载的时候就创建实例
* @author Administrator
*
*/
public class Singleton2 {
//创建私有的静态变量,并创建实例
private static Singleton2 singleton2 =new Singleton2();
//创建私有的构造方法
private Singleton2(){
System.out.println("构造函数执行了");
}
//创建一个共有的静态方法,并返回实例
public static Singleton2 getSingleton2(){
return singleton2;
}
//测试饿汉模式
public static void main(String[] args) {
Singleton2 s2 = Singleton2.getSingleton2();
System.out.println(s2);
System.out.println(Singleton2.getSingleton2());
System.out.println(Singleton2.getSingleton2());
}
}
3、双重锁模式
package com.singleton;
/**
* 单列模式,双重锁模式
* @author Administrator
*
*/
public class Singleton3 {
//创建一个私有的静态变量
private static Singleton3 singleton3 = null;
//创建一个私有的构造方法
private Singleton3(){
System.out.println("构造函数开始!");
}
//创建一个公有的静态方法,并返回实例
public static synchronized Singleton3 getSingleton3(){
if(singleton3 == null){
synchronized (Singleton3.class) {
if(singleton3 == null){
singleton3 = new Singleton3();
}
}
}
return singleton3;
}
//测试双重锁模式
public static void main(String[] args) {
Singleton3 s3 = Singleton3.getSingleton3();
System.out.println(s3);
System.out.println(Singleton3.getSingleton3());
System.out.println(Singleton3.getSingleton3());
}
}