那怎样才可以达到我的要求呢?我写了一个Singleton类 想让它作为基类,被继承。使得他的子类都具有Singleton的特性。

解决方案 »

  1.   

    "使得他的子类都具有Singleton的特性"?什么意思?是这个类结构里只能生成一个对象呢,还是类结构里的每个类只能有一个对象?
      

  2.   

    "使得他的子类都具有Singleton的特性"因为我做的程序里需要大量的Singleton
    我固然可以为每一个类里加上这样的代码但继承不是就是为了提高代码的重利用性吗?
    所以我把相同的部分做成了一个总基类,就是上面的代码。可是这个类不能被继承,所以我就提出了这样的问题。
      

  3.   

    >>>因为我做的程序里需要大量的Singleton听上去你的设计有问题>>>所以我把相同的部分做成了一个总基类,就是上面的代码建立一个工厂类,里面包含一个对象图,用户使用时,调用某个方法,输入对象类(Class或类名),以及需要的参数,该工厂查询对象图是否已经有此类对象,有点话,就返回该对象,否则的话,生成一个新的对象,同时把该对象放进对象图里.....类似的东西可以参考PEAA一书里的Repository模式
    http://martinfowler.com/eaaCatalog/repository.html
      

  4.   

    TO: taglib我的程序里有很多Listener 譬如:
    final class OKButtonEvent implements ActionListener,
                                         MouseListener,
                                         MouseMotionListener,
                                         FocusListener,
                                         MouseWheelListener {...}是不是应该做成Singleton呢?我也想到了类似你说的方法就是用一个Collections
    不过我觉得还是不像继承来的直观和简单,网上有C++的代码,不过是有Template来参与的
    不知道Java有什么好的办法?
      

  5.   

    问题解决:Singleton模式的要点:
    1、某个类只能有一个实例
    2、必须自行创建这个实例
    3、必须向整个系统提供这个实例 Singleton模式的实现方法
    1、饿汉式singleton
    public class EagerSingleton
    {
    private static final EagerSingleton m_instance = new Eagersingleton();
    private Eagersingleton(){}public static EagerSingleton getInstance()
    {
    return m_instance;
    }}2、懒汉式singleton
    public class LazySingleton
    {
    private static LazySingleton m_instance = null;
    private LazySingleton(){};
    synchronized public static LazySingleton getInstance()
    {
    if( m_instance == null )
    {
    m_instance = new LazySingleton();
    }
    return m_instance;
    }
    }3、登记式singleton
    import java.util.HashMap;
    public class RegSingleton
    {
    static private HashMap m_registry = new HashMap();
    static 
    {
    RegSingleton x = new regSingleton();
    m_registry.put(x.getClass().getName(), x);
    }
    protect RegSingleton(){}
    static public RegSingleton getInstance(String name)
    {
    if(name == null )
    {
    name = "RegSingleton";
    }
    if(m_registry.get(name ) == null )
    {
    m_registry.put(name, Class.forName(name).newInstance();
    }
    catch(Exception e)
    {
    System.out.println("Error happened.");
    }
    return (RegSingleton)(m_registry.get(name));
    }
    }三种Singleton模式的比较饿汉式 类被加载时就被实例化。
    懒汉式 类加载时,不被实例化,在第一次引用时实例化。 
    饿汉式、懒汉式都不能被继承
    而登记式可以被继承。