一、什么是单例模式:
单例模式确保某一个类只有一个实例,而且向这个系统提供这个实例。
二、单例模式的要点:
1、某个类只能有一个实例
2、它必须自行创建这个实例
3、必须自行向这个系统提供这个实例
举例:饿汉式单例类
package design.Singleton;
/***********************************************************************
*
* Singleton2.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:34:51 PM
* @revision $Id: *
***********************************************************************/
public class Singleton2 {
private static Singleton2 singleton2 = new Singleton2();
private Singleton2(){
}
public static Singleton2 getInstance(){
return singleton2;
}
}
2:懒汉式单利类
package design.Singleton;
/***********************************************************************
*
* Singleton1.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:32:04 PM
* @revision $Id: *
***********************************************************************/
public class Singleton1 {
private static Singleton1 ingleton1;
private Singleton1(){
}
public static synchronized Singleton1 getInstance(){
if(null==ingleton1){
ingleton1= new Singleton1();
}
return ingleton1;
}
}
3:同步安全单列类
package design.Singleton;
/***********************************************************************
*
* Singleton3.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:36:34 PM
* @revision $Id: *
***********************************************************************/
public class Singleton3 {
private static Singleton3 singleton3;
private Singleton3() {
}
public static synchronized Singleton3 getInstance() {
if (null == singleton3) {
synchronized (Singleton3.class) {
if (null == singleton3) {
singleton3 = new Singleton3();
}
}
}
return singleton3;
}
}
下面用测试代码说明 只创建一个类
Message (辅助类)
package design.Singleton;
/***********************************************************************
*
* Message.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:47:32 PM
* @revision $Id: *
***********************************************************************/
public class Message {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
测试类
package design.Singleton;
import java.util.ArrayList;
import java.util.List;
/***********************************************************************
*
* test.java
* @copyright Copyright: 2009-2012
* @creator 周辉<br/>
* @create-time Jan 26, 2010 4:39:48 PM
* @revision $Id: *
***********************************************************************/
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Singleton3> list = new ArrayList<Singleton3>();
for (int i=0;i<5;i++){
Singleton3 s1=Singleton3.getInstance();
if(!list.contains(s1)){
list.add(s1);
}
}
List<Message> list2 = new ArrayList<Message>();
for (int i=0;i<5;i++){
Message m= new Message();
if(!list2.contains(m)){
list2.add(m);
}
}
System.out.println("size"+list.size());
for (Singleton3 s:list){
System.out.println("hashcode"+s.hashCode());
}
System.out.println("size2"+list2.size());
for (Message s:list2){
System.out.println("hashcode2"+s.hashCode());
}
}
}
测试结果分析Singleton3 只创建一个类 list 个数只有一个(如果放开代码 if(!list.contains(s1)){ )显示hashcode 值相同 而Message 创建5个对象 list个数为5个 hashcode值分别不相同。
所以 单列类只创建一个实例