单例模式特征
-
私有的构造方法;
-
指向自己实例的私有静态引用;
-
以自己实例为返回值的静态的公有方法
package com.sheji;
/**
* 饿汉模式
* @author YangTG
* 类的构造定义为私有的private。保证其他类不能实例化此类。然后提供一个静态的实例返回给调用者使用。
* 饿汉模式是最简单的设计模式。在类加载的时候就已经实例进行创建了,这个实例在整个程序周期都是存在的。
* 好处是在加载的时候就被创建了。只需要创建一次就可以了。
* 缺点就是,不需要使用的时候也会创建。而且在类加载的时候就被创建。一直存在内存中。会造成浪费
*
*/
public class Singleton1 {
private static Singleton1 sing = new Singleton1();
private Singleton1(){
}
public static Singleton1 newInstance(){
return sing;
}
}
-
立即加载 : 在类加载初始化的时候就主动创建实例;
-
延迟加载 : 等到真正使用的时候才去创建实例,不用时不去主动创建
package com.sheji;
/**
* 懒汉模式
* @author YangTG
* 单利中的懒汉模式。在需要的时候才去创建。如果单列已经创建,则再次调用就返回上次创建的对象,不会创建对象。
* 如果某个单列使用的次数少,而且创建时候很消耗资源。懒汉模式就很适用
*/
public class Singleton2 {
private static volatile Singleton2 sing = null;
private Singleton2(){
}
public static Singleton2 newInstance(){
if(null==sing){
sing = new Singleton2();
}
return sing;
}
//看似很完美,但是如果多个线程情况下的话,还是会创建多个实例。这个时候就需要加锁
public static synchronized Singleton2 getnewInstance(){
if(null==sing){
sing = new Singleton2();
}
return sing;
}
//枷锁后解决了多线程创建多个实例问你,但是synchronized修饰后会很慢使用双重校验.属性加volatile
public static Singleton2 getnewInstance1(){
if(sing==null){
synchronized(Singleton2.class){
if(null==sing){
sing = new Singleton2();
}
}
}
return sing;
}
}
package com.sheji;
/**
* 使用静态内部类实现单利模式
* @author YangTG
*
*/
public class Singleton3 {
private static class SingletonHolder{
public static Singleton3 sing = new Singleton3();
}
private Singleton3(){
}
public static Singleton3 getNewInstance(){
return SingletonHolder.sing;
}
}