gpt4 book ai didi

java - 单例模式: getInstance() vs Passing the singleton object?

转载 作者:行者123 更新时间:2023-11-30 01:44:43 24 4
gpt4 key购买 nike

使用单例模式的正确/最流行的方法是什么。

  1. 限制数量。调用 getInstance() 的次数,最好只调用一次,然后在实例化期间将对象传递给其他类?
class SingletonClass {
// Implementataion
}

class MainClass {
private SingletonClass singletonClassObject;

public MainClass() {
singletonClassObject = SingletonClass.getInstance();
new SomeClass(singletonClassObject).doSomething();
new SomeOtherClass(singletonClassObject).doSomethingElse();
}
}

class SomeClass {
private SingletonClass singletonClassObject;

public SomeClass(SingletonClass singletonClassObject) {
this.singletonClassObject = singletonClassObject;
}

public void doSomething() {
System.out.println(singletonClassObject.getStuff());
}
}

class SomeOtherClass {
private SingletonClass singletonClassObject;

public SomeOtherClass(SingletonClass singletonClassObject) {
this.singletonClassObject = singletonClassObject;
}

public void doSomethingElse() {
System.out.println(singletonClassObject.getStuff());
}
}

  • 不要传递单例对象。而是调用获取每个类中的对象引用并将引用保存为实例变量并在需要的地方使用它。
  • class SingletonClass {
    // Implementataion
    }

    class MainClass {
    public MainClass() {
    new SomeClass().doSomething();
    new SomeOtherClass().doSomethingElse();
    }
    }

    class SomeClass {
    private SingletonClass singletonClassObject;

    public SomeClass() {
    singletonClassObject = SingletonClass.getInstance();
    }

    public void doSomething() {
    System.out.println(singletonClassObject.getStuff());
    }
    }

    class SomeOtherClass {
    private SingletonClass singletonClassObject;

    public SomeOtherClass() {
    singletonClassObject = SingletonClass.getInstance();
    }

    public void doSomethingElse() {
    System.out.println(singletonClassObject.getStuff());
    }
    }

  • 甚至不要将引用保存为实例变量,而是在需要该对象的任何地方使用 SingletonClass.getInstance()。
  • class SingletonClass {
    // Implementataion
    }

    class MainClass {
    public MainClass() {
    new SomeClass().doSomething();
    new SomeOtherClass().doSomethingElse();
    }
    }

    class SomeClass {
    public SomeClass() {
    }

    public void doSomething() {
    System.out.println(SingletonClass.getInstance().getStuff());
    }
    }

    class SomeOtherClass {
    public SomeOtherClass() {
    }

    public void doSomethingElse() {
    System.out.println(SingletonClass.getInstance().getStuff());
    }
    }

    这些方法如何相互比较?更好的设计、可测试性等?哪个更好?为什么?

    最佳答案

    如果我们暂时假设 SingletonClass 不是单例,并且我们没有通过调用 static 方法获得实例,我们将面临另一个问题,如何链接这些类一起。这个问题是通过依赖注入(inject)解决的,这个概念在这里有很好的描述:

    阅读完上面的内容后,应该很容易选择选项.1,其中所有类都在构造函数中获取对所需依赖项的引用。您甚至可以为您需要的行为创建一个接口(interface),并在SingletonClass 中实现它。现在您看到了,该类实现了 Singleton 的事实模式并没有使它变得特别,我们应该像其他类一样注入(inject)它们。使用 DI 带来的所有好处都可以应用到您的类(class)中。

    只需将其与 .3 进行比较,您就需要编写一个需要模拟某些内容的测试。这将是比 .1 更令人不愉快的任务。

    关于java - 单例模式: getInstance() vs Passing the singleton object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58550151/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com