如何用单例和静态方法实现多态?

时间:2012-01-24 15:37:18

标签: java spring design-patterns java-ee

所以我有

    public class ApplicationConfig{

        public static ApplicationConfig getCurrentInstance(){
           //Something similar to this
        if(instance==null){
          FacesContext fc =FacesContext.getCurrentInstance();
            if(fc==null)
                return null;
            wac = FacesContextUtils.getWebApplicationContext(fc);
        }
        instance =(ApplicationConfig)wac.getBean("appConfig");
          }
          return instance;
        }

    }

检索当前实例的方式与application1和application2不同。一旦我从春天读到它,一旦我使用普通的单一模式。

有办法吗?两个配置共享一些配置 - 例如

public boolean isConfiguredForFoo() {
    return getCurrentInstance().getPropertyFoo().equals("foo");
}

编辑所以我最终希望能够做到以下几点,或类似的东西:

ApplicationConfig.getCurrentInstance().isApplication1();

ApplicationConfig是一个抽象或接口,application1带有getCurrentInstance和application2的实现,并带有它自己的实现。

此外:调用isConfiguredForFoo()最后调用getCurrentInstance。我无法提取此函数,因为抽象类中没有getCurrentInstance的实现,并且定义静态抽象方法是非法的。有什么方法可以将所有isXXXXConfigured()保存在一个地方并坚持DRY原则?

我对applicationSfig中的jsf和spring依赖于application1,而application2中没有依赖项。如何使用Application1的ApplicationConfig中的大多数函数,只避免访问这些依赖项的关键getCurrentInstance()函数?

2 个答案:

答案 0 :(得分:0)

我不明白你想要存档什么?
但我怀疑两个应用程序都以相同的方式检索ApplicationConfig。

  • 应用1:具有factory-method=getCurrentInstance
  • 的春天
  • App 2:手动调用getCurrentInstance();

答案 1 :(得分:0)

我不确定您到底在做什么,但以下可能有用:

 public abstract class AppConfig {

    private static AppConfig instance;
    static {
       if (whatever...)
          instance = new AppConfig1(); 
       else 
          instance = new AppConfig2();
    }

    public static AppConfig getInstance() {
       return instance();
    }   
 }

...

 if (AppConfig.getInstance() instanceof AppConfig1)
    ...

如果您有时在Spring中重复使用某些代码进行配置,有时在外部,可能最好为两种情况重写不同的类。