【问题标题】:Singleton-like pattern for cases when hiding constructor is not possible?无法隐藏构造函数的情况下的单例模式?
【发布时间】:2021-05-16 15:01:17
【问题描述】:

我知道单例模式

我需要在两个类实例之间实现双向通信,但实例化不是由我完成的(而是由一些第 3 方库完成的)。

此第 3 方库还要求公共默认构造函数必须以这种形式提供:

public MyClassA(Context ctx);

这个第 3 方库将初始化我的两个类 MyClassAMyClassB

在它们之间进行通信(调用彼此的函数)的最有效/推荐的技术是什么?

因此,第 3 方库使用上面显示的构造函数实例化 MyClassA。它还实例化MyClassB(与MyClassA 具有相同的签名)。

然后在这个第 3 方的一些事件(它调用 MyClassA 的名为 onEvent0 的实现方法)我需要调用 MyClassB 的实例的 doSomeAction 函数:

3rdpartylib::notify -> myclassa::onEvent0() -> myclassb::doSomeAction

我知道当第 3 方实例化我的类时我可以存储一个实例,但如果我们考虑到具有一些不错的 HandlerServiceConnection 范例的 Android 平台,这是推荐的方式吗?

【问题讨论】:

  • “那么在这个第 3 方的一些事件(调用 MyClassA 的名为 onEvent0 的实现方法)中,我需要调用 MyClassB 的实例的 doSomeAction 函数”——为什么?为什么MyClassB 不能持有其他对象,而您的MyClassA 对象可以调用doSomeAction()?例如,MyClassB(可能还有MyClassA)可以是其他执行实际工作的对象的薄包装,其中那些其他对象是通过依赖反转框架(Dagger/Hilt、Kotlin 中的 Koin 等)获得的。在连接这些其他对象时,您将拥有更大的灵活性。

标签: java android singleton


【解决方案1】:

您可以使用观察者设计模式来解决这个问题。正如您的问题清楚地表明您需要通过 3rdpartylib 的通知调用 myClassA 中的某些函数。

创建一个主题类,你的 3rdpartylib 将调用 func notifyObservers

public class ThirdPartyLibSubject {
    private List<ThirdPartyLibObserver> observers = new ArrayList<>();

    public void register(ThirdPartyLibObserver observer){
        observers.add(observer);
    }

    public void unregister(ThirdPartyLibObserver observer){
        observers.remove(observer);
    }

    public void notifyObservers(){
        observers.forEach(ThirdPartyLibObserver::update);
    }
}

现在为你的主题创建观察者,这样你就可以保留你的类的 Singleton 属性MyClassA

public interface ThirdPartyLibObserver {
    void update();
}

public class ObserverClassA implements ThirdPartyLibObserver{
    @Override
    public void update() {
        MyClassA.getInstance().onEvent0();
    }
}

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 2013-08-12
    • 2011-06-13
    • 1970-01-01
    • 2021-12-29
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多