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

标签 java oop design-patterns singleton

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

  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/

    相关文章:

    php - 是不是可以调用这个stmt fetch语句呢?

    c# - 在 C# 中使用只读类进行设计

    java - 适当的Java设计模式以避免方法重复

    java - 从单一父类(super class)继承的各种DS的合理实现

    C++ - 如何让移动点连续循环?

    java - 在 Java 中实现事件生成器习惯用法

    java - 如何一般地指定可序列化列表

    java - java中dll的使用相关

    java - 查找字符在字母表中的位置

    java - 使用泛型类型拥有通用方法