------------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! -------------
java设计模式之单例模式详解
(设计模式)Design pattern
主要经典的设计模式总共有二十三种,现在我们来看看设计模式中第一个经典设计模式单例模式(Singleton)。单例模式表示一个类只会生成唯一的一个对象。
单例模式有两张实现方式:
第一种:
public class Singleton {
public static void main(String[] args) {
A a1=A.getInstance();
A a2=A.getInstance();
System.out.println(a1==a2);//判断A类型的引用是否相等,是的话返回true,
}
}
class A{
private static A a=new A();//必须用修饰符private,且static修饰,否则无法被静态方法使用
private A(){ //构造方法也要设成私有的,这样防止在别的方法里new一个A。
}
public static A getInstance(){ //获得实例,且用static是为了使用方便使用类调用静态方法,因为构造方法已经new,无法生成一个引用啊
return a; //将返回A类型的引用 a的地址,即new A();
}
}
第二种:
public class Singleton {
public static void main(String[] args) {
A a1=A.getInstance();
A a2=A.getInstance();
System.out.println(a1==a2);//判断A类型的引用是否相等,是的话返回true,
}
}
class A{
private static A a;//必须用修饰符private,且static修饰,否则无法被静态方法使用
private A(){ //构造方法也要设成私有的,这样在别的方法里就无法new一个A。
}
public static A getInstance(){ //获得实例
if(a==null){
a=new A();
}
return a; //将返回A类型的引用 a的地址,即new A();
}
}
总结:单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例
我们说Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)
但是以上实现没有考虑线程安全问题。所谓线程安全是指:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。显然以上实现并不满足线程安全的要求,在并发环境下很可能出现多个Singleton实例。
结论:总之一句话,单例模式为一个面向对象的应用程序提供了对象惟一的访问点,不管它实现何种功能,整个应用程序都会同享一个实例对象。