Java设计形式—单态模式(Singleton)

Java设计模式—单态模式(Singleton)

  单态模式(也有叫单例模式)表示一个类只有一个实例存在,生成用单态模式设计类不能用new 关键字来获得。可用简单的一句话来概括单态模式:

      构造方法私有化,通过共有的静态方法返回类的实例。

    最近在项目开发中,程序用到的各个参数被单独拿出来做成一个配置文件,程序接收到用户的定位请求就从配置文件读取出对应的参数和客户端中请求的参数比对,然后把定位请求发送到不同的定位平台,但问题来了,每次读取文件就要new 一个文件对象,而定位请求每秒可能有几个至几十个,频繁的文件读取导致服务器性能下降(读取文件,要生成文件对象,打开文件流,读取,关闭文件流)。就种情况就要用到单态模式,程序一启动就生成唯一的一个文件对象,这样每次读取文件不再与文件物理的建立I/O流,直接从内存中读取即可。

1.单态类(懒汉式单态类)

package com.sunnylocus.singleton;

import java.io.File;

public class Singleton {
	private static Singleton instance;
	private static File configFile;
	private Singleton() { //构造方法私有化
	}
	/** 获得配置文件对象*/
	public File getConfigFile() {
		return configFile;
	}
	/** 获得Singleton类的实例*/
	public static synchronized Singleton getInstance() {//通过公有的静态方法返回类的实例
		if(instance == null) {
			configFile = new File("src/com/sunnylocus/singleton/locationConfig.xml"); 
			instance = new Singleton();
		}
		
		return instance;
	}
}

 

2.Test

package com.sunnylocus.singleton;

import java.io.File;

public class Main {
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
		
		if(s1 == s2) { //比较地址
			System.out.println("s1和s2是同一个对象的实例");
		}
		else {
			System.out.println("s1和s2不是同一个对象的实例");
		}
		
		File f1 = s1.getConfigFile();
		File f2 = s1.getConfigFile();
		if(f1 == f2) {
			System.out.println("来自同一个文件对象");
		}
		else {
			System.out.println("不是来自同一个文件对象");
		}
	}
}

 

3.output:

 

s1和s2是同一个对象的实例
来自同一个文件对象

 

 

二、饿汉式单态类

public class TestSingleton {
	private static final TestSingleton instance = new TestSingleton();
	
	private TestSingleton() {
	}
	/** 静态工厂方法*/
	public static TestSingleton getInstance() {
		return instance;
	}
}

 

 

 

 

 

 

 

1 楼 lyhngu 2009-02-27  
你这单态有问题
2 楼 sunnylocus 2009-03-01  
lyhngu 写道

你这单态有问题

请赐教Java设计形式—单态模式(Singleton)
3 楼 superwind 2010-07-13  
你这个单态多线程情况下会出问题
4 楼 sunnylocus 2010-07-14  
superwind 写道
你这个单态多线程情况下会出问题

谢谢提醒,在多线程环境下getInstance()方法需要加同步控制
5 楼 cocoy2006 2010-11-04  
方法加synchronized ,效率有点低