java设计模式中有一个模式叫单例模式,单例的意思就是该类只能产生一个实例,平时我们定义类可以随自己的意愿创建任意多的实例,但有些情况下,我们必须只能让某些类产生一个实例,像打印机一次只能执行一个打印进程,否则就会乱了。定义单例类我们就不能像普通定义类那样去定义该类了。从例子开始讲解怎么定义产生单例的类。
1 class Singleton 2 { 3 private static Singleton singleton = new Singleton();//用static关键字修饰单例类实例,并定义为私有的 4 private Singleton()//把构造方法定义为私有,这是最重要的 5 { 6 System.out.println("http://www.cnblogs.com/zhi-hao/"); 7 } 8 9 public static Singleton getSingleton()//定义一个获得单例实例的方法,并用static修饰,这样外面就可以直接通过类名来调用该方法了 10 { 11 return singleton; 12 } 13 }
1 public class TestSingleton 2 { 3 public static void main(String[] args) 4 { 5 //生成两个实例 6 Singleton s1 = Singleton.getSingleton(); 7 Singleton s2 = Singleton.getSingleton(); 8 if(s1.equals(s2))//判断是否相等 9 { 10 System.out.println("s1 == s2"); 11 System.out.println(s1);//打印输出s1 12 System.out.println(s2);//打印输出s2 13 } 14 else 15 { 16 System.out.println("s1 != s2"); 17 System.out.println(s1); 18 System.out.println(s2); 19 } 20 } 21 }
结果:
在定义单例类时更为标准的是下面的方法
1 class Singleton 2 { 3 private static Singleton singleton = null; 4 5 private Singleton() 6 { 7 System.out.println("http://www.cnblogs.com/zhi-hao/"); 8 } 9 10 public static Singleton getSingleton() 11 { 12 if(null == singleton)//判断是否生成了实例,是就直接返回,否就先生成再返回生成的实例 13 { 14 singleton = new Singleton(); 15 } 16 return singleton; 17 } 18 }
以上是在忽略线程或线程安全的情况下成立,如果存在线程时,可能多个线程同时访问生成单例的代码从而就又可能生成多个实例。线程安全是指一个程序中存在多线程,但执行结果跟单线程的执行结果一样,线程也是java中很重要的一个知识点,在这里不详细讨论。