要是什么条件都没有的话  应该做不了你这种方式  返回的类型应该是Object  (Class.forName(className)).newInstance();这句话是调用的构造方法  
破坏了singleton模式BaseClass theClass = (BaseClass)(Class.forName(className)).newInstance();
你这样编码   返回的只能是BaseClass或者子类  你这个方法问题很大有个方法不知道能不能对你有用一般singleton模式都有特定的方法返回自己的实例 如 instance 
可以用以下的方法判断  是不是有这个方法
java.lang.reflect.Method mothed = SingleClass.class.getMethod("instance ", null);
如果没有 这句话会抛异常
java.lang.NoSuchMethodException
抓住它  返回这个 (Class.forName(className)).newInstance(); 对象如果有这个方法 就是singleton 调用这个方法  
mothed.invoke(singleClass, null);
得到唯一的实例  返回它

解决方案 »

  1.   

    不过缺点就是你必须让你的singleton类拥有一个固定的static方法名,比如getInstance()
      

  2.   

    singleton模式的类都有一个获取类实例的唯一静态方法,所以用接口没法实现,因为接口里不能定义静态方法,这个我已经试过了。我现在singleton模式的类都有一个getInstance()的静态方法,jokerjava(冷血) 的建议应该是非常正确的,我马上就试试……非常感谢各位的支持!
      

  3.   

    还有问题:java.lang.reflect.Method mothed = SingleClass.class.getMethod("instance ", null);我的类名是一个String的字符变量,怎么替换SinglClass?
      

  4.   

    类名是什么就用什么调用class.getMethod,比如类名是XXX,里面有个方法是instance,参数无,那么就可以java.lang.reflect.Method mothed = XXX.class.getMethod("instance ", null);
      

  5.   

    kofwr(搭补流二) 你可能没有看到我的方法,如下:public static BaseClass getClass(String funcId) {
        String className = theContainer.get(funcId);
        //className就是我要实例化的singleton模式类的完整类名(包括包名)
        //因为是用工厂模式创建类的实例,所以事先不能知道类名,所以这个XXX就不知道怎么替换了……
        java.lang.reflect.Method mothed = XXX.class.getMethod("instance ", null);
        ……
    }
      

  6.   

    singleClass.getClass.getMethod("instance ", null);
    呵呵得到对象实例对应的的类  调用方法 getClass() 就可以了
      

  7.   

    可能工厂模式下,真的是无法实例化一个singleton模式的类了,不过我可以做一个中间的代理类,实例化这个代理类然后再实例化singleton模式的类,但就是每个singleton模式的类都要有一个代理类了……
      

  8.   

    jokerjava(冷血),你的singleClass.getClass().getMethod("instance ", null)因为在我程序中singleClass是一个String类型的变量,所以getClass().getMethod()返回的是String类的方法,不能得到这个String类型变量值(变量值为类名)所代表类的方法。
      

  9.   

    我写了点东西   你看看  能不能用的上
    好像还可以import java.lang.reflect.*;class Product {}
    class Product1 extends Product {
      static Product1 product = new Product1();
      public static Product1 getInstance() {
        System.out.println("singleton");
        return product;
      }
    }
    class Product2 extends Product {}public class TestFactory {  public TestFactory() {
      }  public static Product factory(String val) {
        Product product = null;
        try {
          product = (Product) (Class.forName(val)).newInstance();
          try {
            Method mothed = (Method)product.getClass().getMethod("getInstance", null);
            product = (Product)mothed.invoke(product, null);
          } catch (java.lang.NoSuchMethodException ex1) {
            return product;
          } catch (java.lang.SecurityException ex2) {
            ex2.printStackTrace();
          }    }
        catch (Exception e) {
          e.printStackTrace();
        }
        return product;
      }
      public static void main(String[] args) {
        TestFactory.factory("Product1");
        TestFactory.factory("Product2");
      }}
      

  10.   

    我现在singleton类没有public的构造器,只有一个private的构造器,供getInstance()调用,以保证在整个内存中只有一个此类的实例,所以在执行product = (Product) (Class.forName(val)).newInstance();会出错。但jokerjava(冷血)的这个例子对我还是很有启发性的,谢谢jokerjava(冷血),谢谢大家!