猿问

单例模式:getInstance() 与传递单例对象?

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

  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();

    }

}



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


慕后森
浏览 138回答 2
2回答

一只甜甜圈

如果我们暂时假设这SingletonClass不是单例,并且我们没有通过调用方法获得实例static,那么我们将面临另一个问题,即如何将这些类链接在一起。这个问题是通过以下方法解决的Dependency Injection,这个概念在这里得到了很好的描述:控制容器反转和依赖注入模式单元测试 101:控制反转阅读完上面的内容后,应该很容易选择.1所有类都在构造函数中引用所需依赖项的选项。interface您甚至可以为您需要的行为创建一个并在 中实现它SingletonClass。现在你看到了,类实现Singleton模式这一事实并没有使它变得特别,我们应该像其他类一样注入它们。使用您带来的所有好处都DI可以应用于您的班级。只需将其与您进行比较.3,您就需要编写一个需要模拟某些内容的测试。如果是的话,这将是更令人不愉快的任务.1。

30秒到达战场

这样看:您质疑编译器是否能够识别静态最终引用可以编译为内联引用。我猜编译器会将 getInstance() 转换为内联引用。我不太相信编译器会认识到,当您按值传递引用时,您是故意为自己创建额外的工作,并且当您传递引用时,它会在堆栈上创建一个额外的引用。我的猜测是 getInstance() 会更有效。
随时随地看视频慕课网APP

相关分类

Java
我要回答