单例类是指仅有一个实例的类,在系统中具有唯一性的组件可作为单例类,这种类的实例通常会占用较多的内存,或者实例的初始化过程比较冗长,因此随意创建会影响系统性能。
Struct框架的ActionServlet类和Hibernate的SessionFactory和Configuration类也是单例类:
import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class GloabalConfig { private static final GloabalConfig INSTANCE=new GloabalConfig(); private Properties properties=new Properties(); private GloabalConfig(){ try { //加载配置信息 //InputStream in=getClass().getResourceAsStream("myapp.properties"); //读取文件要使用类加载器[因为类加载器读取资源的时候,默认的主目录是src目录] InputStream in=GloabalConfig.class.getClassLoader().getResourceAsStream("myapp.properties"); properties.load(in); in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static GloabalConfig getInstance(){ //静态工厂方法 return INSTANCE; } public Properties getProperties(){ return properties; } public static void main(String[] args) { String name=GloabalConfig.getInstance().getProperties().getProperty("name"); System.out.println(name); } }
以上GloabalConfig类就是单例类,用于存放软件系统配置的信息。GloabalConfig类从配置文件中读取配置信息,并存放在properties属性中:
实现单例类两种方式:
(1)把构造方法定义为private类型,提供 public static final类型的静态变量,该变量引用类的唯一实例:
public static final GloabalConfig INSTANCE=new GloabalConfig();
(2)把构造方法定义为private类型,提供public static类型的静态工厂方法:如上
这样更加灵活,可以修改静态工厂方法getInstance()的实现方式。