java设计模式之单例模式

来源:互联网 发布:excel对比数据 编辑:程序博客网 时间:2024/06/17 13:55

定义

-单例模式是用来创建独一无二,只能有一个实例的对象的模式(确保一个类只有一个实例,并提供一个全局访问点)
-应用的场景:主要应用于只需要一个对象的地方,eg:线程池(threadpool),缓存(cache),日志对象等。
-在学习单例模式之前的可能想法,通过开发者之间的约定或者通过java的静态变量就可能能做到
-这种方法可能产生的问题是:如果把对象赋值给一个全局变量,那么全局对象就要在程序一开始之前就创建好,假设这个对象非常耗费资源我们用到它的地方又不多,就会形成资源的浪费,单例产生的对象就能在我们需要它的时候才创建对象
-那么问题来了,如何保证对象只被创建一次

public class Singleton()
{
private static Singleton uniqueInstance;
//用一个静态变量来申明唯一实例
private Singleton(){}
//私有构造方法,别人不可以调
public static Singleton getInstance(){
if(uniqueInstance==null){
uniqueInstance = new Singleton();
}//实例化getInstance返回实例
return uniqueInstace;
}
}

再谈

-对于管理资源这是一个很好的设计模式
-确定只有一个实例的原因是此类的构造器是私有的,要获得实例,必须通过静态方法getInstance
类图如下
单利模式也是有一般的类数据和方法的

ps:单例可以延迟实例化

以上所谈都是基于单线程的现在扩展到多线程,根据os的概念,自行理解多线程的情况(主要是可能不止一个实例)

public class Singleton(){
private static Singleton uniqueInstance;
private Singleton(){}
public statics synchronized Singleton getInstance(){
if(uniqueInstance==null){
uniqueInstance = new Singleton();
}
return uniqueInstace;
}

}

以上的问题是会消耗大量的资源(土豪的做法)
-急切实例化

public class Singleton(){
private static Singleton uniqueInstance = new Singleton();
private Singleton(){}
public statics Singleton getInstance(){
//if(uniqueInstance==null){
// uniqueInstance = new Singleton();
//
return uniqueInstace;
}

}
以上做法是那些总是创建并使用单例的程序,这个做法依赖jvm加载这个类时马上创建此唯一的单件实例,保证任何线程访问静态变量之前一定创建实例
双重检查加锁(s)

public class Singleton(){
private volatile static Singleton uniqueInstance;
private Singleton(){}
public statics Singleton getInstance(){
if(uniqueInstance==null){
synchronized(Singleton.class){
if(uniqueInstance==null){
uniqueInstance = new Singleton();
}
return uniqueInstace;
}

}
}

以上只有第一次才永不,双重加锁。减少时间的耗费。
ps:1.5以及以后的版本才支持
注意:很多情况下开发适合使用单例模式的情况下其实并不多

0 0
原创粉丝点击