首页 > 代码库 > 单例模式

单例模式

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);//打印输出s112             System.out.println(s2);//打印输出s213         }14         else15         {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中很重要的一个知识点,在这里不详细讨论。

 

单例模式