1.单例设计模式(singleton)
用途举例:对于多个程序使用同一个配置信息对象时比如在连接数据库时使用单例模式,每次只取出一个连接
步骤:①私有化该类的构造函数
②私有化一个静态的对象
③公有化一个静态方法,将创建的对象返回
懒汉式 模板:
/**
* 懒汉式:初始化的时候就会构造一个实例,消耗内存,但是不用考虑多线程的问题
* @author
*/
public class Singleton {
private Singleton(){ }
private static Singleton singleton = new Singleton();
public static Singleton getInstance(){
return singleton;
}
}
饿汉式模板:
/**
* 饿汉式:延迟初始化这个单例实例 ,要考虑多线程同时请求初始化的问题
* 延迟初始化原因:①静态初始化时,没有足够的信息对单例进行初始化
* ②与获取资源有关,例如数据库连接,尤其在一个特定会话中,它包含的应用程序并不需要该对象实例时
*
*/
public class SingletonOfHungry {
private static Object classLock = SingletonOfHungry.class;
private SingletonOfHungry() {
}
private static SingletonOfHungry singletonOfHungry = null;
public static SingletonOfHungry getInstance(){
synchronized (classLock){//同步
if (singletonOfHungry == null){
singletonOfHungry = new SingletonOfHungry();
}
return singletonOfHungry;
}
}
}
饿汉式demo:
/**
* 未初始化饿汉式单例工厂
*/
public class Factory {
private long num;
private static Object classLock = Factory.class; private Factory(){
num = 0;
}
private static Factory factory;
public static Factory getFactory(){
synchronized (classLock){
if (factory==null){
factory = new Factory();
}
return factory;
}
} public void recordNum(){
synchronized (classLock){
num++;
}
}
}
获得实例还可以这么写:
public static Factory getFactory(){
if(factory==null){ //当实例化之后就不需要再加锁
synchronized (classLock){
if (factory==null){ //防止在加锁后,被其他线程实例化,此时也不需要实例化
factory = new Factory();
}
}
}
return factory;
}