单例模式

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 }
Singleton
 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 }
TestSingleton

结果:

 

在定义单例类时更为标准的是下面的方法

 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 }
Singleton

以上是在忽略线程或线程安全的情况下成立,如果存在线程时,可能多个线程同时访问生成单例的代码从而就又可能生成多个实例。线程安全是指一个程序中存在多线程,但执行结果跟单线程的执行结果一样,线程也是java中很重要的一个知识点,在这里不详细讨论。

 

posted @ 2014-09-12 23:52  CIACs  阅读(437)  评论(0编辑  收藏  举报