单例模式(Singleton Pattern),顾名思义,就是一个类只有一个实例,并且对整个系统提供这个实例
demo1:
public class Singleton {
private static final Singleton singleton = new Singleton();
//限制产生多个对象
private Singleton(){
}
//通过该方法获得实例对象
public static Singleton getSingleton(){
return singleton;
}
//类中其他方法,尽量是static
public static void doSomething(){
}
}
有时会把demo1称为饿汉式单例,还有一种是懒汉式单例,也就是需要的时候才创建,仅且只有一个实例,代码如下
demo2:
public class Singleton {
private static final Singleton singleton =null;
private Singleton(){
}
//获得对象
public static Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton ;
}
}
应该能看出来demo1与demo2的区别,应该也能看出来demo2存在着线程安全的问题,因此对demo2进一步完善,可以加上Synchronized在方法上,或者在代码块上进行同步安全,代码如下:
public class Singleton {
private static final Singleton singleton =null;
private Singleton(){
}
//获得对象
public static synchronized Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton ;
}
}
单例模式的好处:
1,减少内存的开销
2,减少性能的开销
3,避免对资源的多重占用
4,单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理
缺点:
1,没有接口,扩展性难
2,违反单一职责原则
3,测试时候需要等对象创建完成
使用场景:
一个类只有一个对象,对于系统中要求也是
1,要求生成唯一序列号的环境,
2,在整个项目中需要一个共享访问点或共享数据。单例则共享对象,可以做到数据的共享,但是要保证线程的安全问题
3,当创建的对象消耗太大时,可以使用单例模式
4,系统中使用的是大量的静态的资源的时候可以使用单例
谢谢大家 ^_^