Java 寻找某种模式

Java 寻找某种模式,java,android,Java,Android,我有一个库项目,它包含一个抽象类,比如说ClassA。在使用该库项目的项目中,我有扩展了ClassA的ClassB 现在我的问题来了。在库项目中,我想使用已实现的ClassB的实例,但我不知道如何检索该实例。这有什么模式或其他想法吗 一个简单的情况图表 编辑 我问这个问题的原因是我正在创建多个应用程序,它们在ClassB中只有不同的方法。因此,我正在创建一个所有这些应用程序都可以使用的库,只需扩展ClassA。这些应用程序是使用库的独立项目。将类B移动到与类A相同的库中。您的项目已经依赖于库,因

我有一个库项目,它包含一个抽象类,比如说
ClassA
。在使用该库项目的项目中,我有扩展了
ClassA
ClassB

现在我的问题来了。在库项目中,我想使用已实现的
ClassB
的实例,但我不知道如何检索该实例。这有什么模式或其他想法吗

一个简单的情况图表

编辑


我问这个问题的原因是我正在创建多个应用程序,它们在
ClassB
中只有不同的方法。因此,我正在创建一个所有这些应用程序都可以使用的库,只需扩展
ClassA
。这些应用程序是使用库的独立项目。

将类B移动到与类A相同的库中。您的项目已经依赖于库,因此它仍然可以引用类B,但现在库中的其他类也可以使用类B。

如果库需要使用类B,那么ClassB应该是您的库的一部分。您的库不需要知道使用它的项目中的类

如果您的库只需要一个ClassA,而您有一个ClassB,则可以在传入对象之前将其强制转换为ClassA,如下所示:

ClassB b = new ClassB();
ClassA a = (ClassA)b;
// pass a into your library

这不是很清楚,但据我所知,如果你想得到
ClassB
的一个实例,你只需要做一个
newclassb()

你想要的是类似于模式的东西。应用程序代码(调用库的代码)在某种程度上需要传入一个工厂类,该工厂类将被库用来创建ClassA对象的实例。在您的例子中,工厂类将生成ClassB的实例

根据类的设计和功能,作为重构的一部分,ClassA可能应该被重新设计为接口,或者至少是抽象类

编辑: 下面是一个未经测试的伪示例:

此代码将在库中

class INeedAFactory {
    public Interface MyFactory {
        public ClassA makeClassAInstance();
    }

    private MyFactory m_factory;
    public registerFactory(MyFactory factory) {
        m_factory = factory;
    }

    private ClassA makeClassAInstance() {
        // m_factory had better not be null!
        return m_factory.makeClassAInstance();
    }

    private void ClassAConsumer() {
        ClassA classA = makeClassAInstance();
        // ... etc. ...
    }
}         
此代码将出现在应用程序中:

class LibraryPatron {
    class MakeClassB implements INeedAFactory.MyFactory {
        public ClassA makeClassAInstance() {
            return new ClassB();
        }
    }
    public LibraryPatron() {
        INeedAFactory libraryObject = new INeedAFactory();
        libraryObject.registerFactory(new MakeClassB());
        // ... etc...
    }
}

那么您正在编写一个抽象类,并且希望它能够获得该类未知子类的所有对象?在我看来,你似乎想要一个像或这样的面向方面的管理。

我写这篇文章时感到恶心,因为你的设计有缺陷,但你问你将如何做到这一点……因此,这里是:

Class<?> bClass = Thread.currentThread().getContextClassLoader().loadClass("com.foo.ClassB");

然而,我会认真地推荐一个更好的解决方案。尝试在一个项目中编写代码,然后重新考虑可以构成“库”的常见内容。

我没有直接访问ClassB的权限,因为它在另一个项目中。这是一个有趣的问题,因为您将有效地创建循环引用。请原谅这个愚蠢的问题,但是如果您显然能够获得库的源代码(从本质上讲,您希望从库中使用ClassB,而不是从扩展应用程序使用ClassB),那么是什么阻止了您这样做呢?我知道这不能直接回答你的问题,但除非有办法“注入”到库中,否则我认为你无法具体地做你想做的事情。@CirrusFlyer:大多数答案都假设库中对ClassB的引用需要硬编码。但是如果使用工厂模式,库可以在不知道ClassB的情况下使用ClassB。请看下面我的答案。@Dan:是的,我同意。这意味着Niek可以修改并访问包含类A的库的源代码。基于他的原始发布(并且没有您建议的任何类似机制,也没有访问源代码的权限),Niek无法实现他想要的。但是,如果他真的能接触到源头,那么一切都会改变。。。事实上,根据他编辑的关于希望在许多应用程序中使用此功能的声明,您的建议是一个很好的解决方案。我认为这将引导我走向正确的方向。我可以创建一个抽象方法
public abstract ClassA getClass()在我的库中,并让另一个项目作为
公共抽象类a getClass(){return new ClassB();}
来实现它。谢谢,这对我帮助很大。@Niek:是的,这可能行得通。唯一的问题是你需要一个地方来放置getClass。显然,您不能将它放在ClassA或ClassB中,因为库不知道如何查找ClassB。这就是为什么我的示例显示了在应用程序代码中创建并传递到库中的单独对象。该对象(在您的示例中,它将实现
getClass()
)有效地为库提供了创建ClassB对象的能力。我知道这有点难看,但该类中的一个或两个方法是造成应用1和应用2之间差异的唯一因素。这样设计似乎是最简单的方法。。嗯,似乎是^^
if (object.getClass() == bClass) { ... }