AbstractFactory扭曲

时间:2011-06-29 17:37:10

标签: java abstract-factory

我遇到了编程问题:

我的Eclipse IDE中有两个 Java 项目:ProjectA和ProjectB。 ProjectB引用ProjectA

我在ProjectA中声明了一个类:ClassA,在ProjectB中声明了一个类:ClassB,这样:

public class ClassA{
  public static Object foo(){
   //blah
  }
}

public class ClassB extends ClassA{
  public static Object foo(){
    //blah
  }
}

我在ProjectA中也有一个名为ClientClass的类。此ClientClass之前用于创建ClassA的实例并使用它。但是现在,基于环境设置,应该为ClientClass提供使用ClassA或ClassB的选项。

这似乎是AbstractFactory模式的一个问题,或者我认为。 我需要创建一个工厂,提供对ClassA或ClassB的访问。 ClientClass不应该知道它是ClassA或ClassB。这需要我为ClassA和ClassB创建一个接口。

我遇到的问题

  • ClientClass不能直接引用ClassB(没有import语句/或新的调用),因为ClassB在不同的项目中。这可能是Eclipse IDE的限制,但在将这两个项目视为jar文件时对我来说也很有意义。循环关系是可以避免的。
  • 我无法为ClassA&创建工厂界面和通用界面。 ClassB,然后通过AbstractFactory模式提供ClassAFactory或ClassBFactory。这是因为在ClassA和ClassB上调用的方法是静态的。这些类的方法需要存在于接口上。但是,在Java中,人们不能拥有“抽象静态”修饰符

有人能为这个问题提出一个优雅的解决方案吗?

2 个答案:

答案 0 :(得分:2)

嗯,这里有很多问题。对于初学者而言,这是最大的一个,但这不会起作用,因为你不能在Java中覆盖静态方法。我认为,你所说的目标是能够在运行时将ClassA替换为ClassB或B或A或其他任何东西,具体取决于某些参数。为此,您需要能够利用动态分派(或简单地说,虚拟方法),这将允许运行时系统选择要在运行时执行的方法的内存地址。静态方法无法做到这一点。您需要使方法非静态才能工作。您不必专门设计Java Interface,但是当您使用ClassB扩展ClassA时,您将能够将对象视为仅仅是ClassA对象。

所有这些都说,如果你从方法中删除静态修饰符并使它们变为非静态,那么你可以在项目A中使用ClassB,而不会在你正在讨论的客户端类中有任何导入语句。但是,在项目A的某个地方,有人需要知道ClassB才能实例化它。当然,除非你想做一些运行时绑定并使用字符串动态加载类。这有意义吗?

答案 1 :(得分:0)

冷杉问题:你的B级和A级的foo方法是静态的。因此没有任何东西被覆盖。如果您打算在ClassB中覆盖foo,则不应将它们设为静态。

这里的第二个问题是上游需要了解下游。那是错的不是吗?

这是否是抽象因素模式的问题除此之外。设计模式只是使代码遵循已知的结构。它本身并不是目的。

目前,为什么Project A中的ClientClass需要了解ClientB?

至于工厂,您的工厂需要在项目B中,它可以是:

班级工厂{

public static ClassA createTheRightOne(EnvironmentSettings settings){//做正确的事情}

}

修复静态修改器