2011-10-01 59 views
5

我只是在学习java,而我遇到了一些问题。 下面我们就简单工厂模式:自动工厂注册

public class SomeFactory { 
    ... 
    public static void registerProduct(String name, Class<? extends IProduct > f) 
} 

public SomeProduct implements IProduct { 
    static { 
     SomeFactory.register("some product", SomeProduct.class); 
    } 
    ... 
} 

所有产品应该在出厂登记。

但是在使用此代码之前,应该加载所有的产品类。 我可以把Class.forName()放在某个地方,例如在main函数中。 但我想避免这样的手动类加载。我只想添加新的IProduct 实现,而不更新其他部分(如SomeFactoryMain方法等)。 但我想知道,是否可以自动加载一些类(例如标注了注释)?

P.S我想要注意的是,在运行时不会添加其他类,所有IProduct实现在编译之前都已知。

UPD#1 感谢您的回答! 但是有可能使用IProduct实例自动生成属性文件? 我的意思是可以制作一些生成属性文件或加载程序代码的构建时脚本(例如,用于maven)?有没有这样的解决方案或框架?

UPD#2 我完成使用Reflections library,其提供运行时信息,通过在启动时扫描类路径。

回答

5

这是可能的,但不容易。它需要扫描类路径中的所有类,以查看它们是否有注释或实现IProduct接口。有关此类问题的答案,请参阅How do you find all subclasses of a given class in Java?

我会保持简单,只需要在工厂本身或外部文件(例如属性文件)中加载类的列表。

3
  1. 让每个产品自身进行注册,使用静态块这样的:

    class MyProduct1{ 
    
        static{ 
         SomeFactory.register(this.getClass()); 
        } 
        .. 
        .. 
    } 
    
  2. 外部属性文件可以跟踪所有产品。

  3. 您的主要方法可以解析此产品列表并执行Class.forName(“..”)。

这样你就不需要编码任何特定的产品,只是属性文件不断变化。啊!是的,加入安全注册也是一个加点。

注:我只是提出一个想法,I'vent尝试过自己:)

+6

怎么是'this.getClass()'将在'静态{}'...工作O_O? –