单例模式有以下三个特点:
一、单例类在整个系统中只能有一个实例
二、单例类必须自己创建自己的实例
三、单例类必须系统中其他对象提供这个实例
单例类分为三种:
第一种:饿汉式,在类被加载时,静态变量m_instance会被初始化,此时类的私有构造子会被调用。
代码如下:
public class NewMMAnalyzer{ private static final NewMMAnalyzer m_instance = new NewMMAnalyzer(); private NewMMAnalyzer() { } public static NewMMAnalyzer getInstance() { return m_instance; }}
第二种:懒汉式,在下面给出懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境
代码如下:
public class NewMMAnalyzer{ private static NewMMAnalyzer m_instance = null; private NewMMAnalyzer() { } synchronized public static NewMMAnalyzer getInstance() { if(m_instance==null){ m_instance = new NewMMAnalyzer(); } return m_instance; }}
第三种:登记式。
代码如下:
package lucene.kameilong.MMtoken;import java.util.HashMap;public class NewMMAnalyzer { static private HashMap<String, NewMMAnalyzer> m_registry = new HashMap<String, NewMMAnalyzer>(); static { NewMMAnalyzer x = new NewMMAnalyzer(); m_registry.put(x.getClass().getName(), x); } protected NewMMAnalyzer() { } public static NewMMAnalyzer getInstance(String name) { if (name == null) name = "lucene.kameilong.MMtoken.NewMMAnalyzer"; if (m_registry.get(name) == null) try { m_registry.put(name, (NewMMAnalyzer) Class.forName(name) .newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return m_registry.get(name); }}