单例模式java主函数怎么写( 四 )


有些设计师在这里建议使用所谓的" 双重检查成例".必须指出的是," 双重检查成例" 不可以在 Java 语言中使用 。不十分熟悉的读者,可以看看后面给出的小节 。
同 样,由于构造子是私有的,因此,此类不能被继承 。饿汉式单例类在自己被加载时就将自己实例化 。
即便加载器是静态的,在饿汉 式单例类被加载时仍会将自己实例化 。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些 。
从速度和反应时间角度来讲,则 比懒汉式单例类稍好些 。然而,懒汉式单例类在实例化时,必须处 理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源 初始化很有可能耗费时间 。
这意味着出现多线程同时首次引用此类的机率变得较大 。饿汉式单例类可以在 Java 语言内实现,但不易在 C++ 内实现,因为静态初始化在 C++ 里没有固定的顺序,因而静态的 m_instance 变量的初始化与类的加载顺序没有保证,可能会出问题 。
这就是为什么 GoF 在提出单例类的概念时,举的例子是懒 汉式的 。他们的书影响之大,以致 Java 语言中单例类的例子也大多是懒汉式的 。
实际上,本书认为饿汉式单例类更符合 Java 语 言本身的特点 。3.登记式单例类.package pattern.singleton; import java.util.HashMap; import java.util.Map;// 登记式单例类.// 类似 Spring 里面的方法,将类名注册,下次从里面直接获取 。
public class Singleton3 { private static Map map= new HashMap(); static { Singleton3 single= new Singleton3(); map.put(single.getClass().getName(),single); }// 保护的默认构造子 protected Singleton3(){}// 静态工厂方法,返还此类惟一的实例 public static Singleton3 getInstance(String name) { if(name== null) { name= Singleton3.class.getName(); System.out.println("name== null"+"--->name="+name); } if(map.get(name)== null) { try { map.put(name,(Singleton3) Class.forName(name).newInstance()); } catch( e) { e.printStackTrace(); } catch( e) { e.printStackTrace(); } catch( e) { e.printStackTrace(); } } return map.get(name); }// 一个示意性的商业方法 public String about() { return"Hello,I am RegSingleton."; } public static void main(String[] args) { Singleton3 single3= Singleton3.getInstance( null); System.out.println(single3.about()); } } 。
【单例模式java主函数怎么写】

单例模式java主函数怎么写

文章插图