有没有任何可行的替代GOF Singleton模式?

面对现实吧。 Singleton模式是一个非常有争议的话题,围绕着围栏两侧的群体程序员。 有些人认为辛格尔顿不仅仅是一个荣耀的全球变量,而且还有那些依靠模式发誓并不断使用它的人。 然而,我不希望辛格尔顿论战成为我问题的核心。 每个人都可以进行拔河比赛,看看谁赢得了我所关心的一切 。 我想说的是,我不相信有一个正确的答案,我不是故意尝试激怒党派争吵。 当我问这个问题时,我只是对单例替代品感兴趣:

他们是否是GOF Singleton Pattern的特定替代品?

例如,很多时候,当我过去使用单例模式时,我只想保存一个或多个变量的状态/值。 但是,变量的状态/值可以使用静态变量在类的每个实例化之间保留,而不是使用单例模式。

你有什么其他想法?

编辑:我真的不希望这是另一篇关于“如何正确使用单身人士”的文章。 再次,我正在寻找方法来避免它。 为了好玩,好吗? 我想我在你最好的电影预告片声音中提出纯粹的学术问题,“在一个没有单身的平行宇宙中,我们能做什么?”


Alex Miller在“Patterns I Hate”中引用了以下内容:

“当一个单身人士看起来像是答案时,我发现通常更聪明的是:

  • 创建一个接口和你的单例的默认实现
  • 在系统的“顶部”构建默认实现的单个实例。 这可能在Spring配置或代码中,或者根据您的系统以各种方式定义。
  • 将单个实例传递给每个需要它的组件(依赖注入)

  • 要理解解决单身人士的正确方法,您需要了解单身人士(以及一般的全局国家)的问题:

    单身人士隐藏依赖关系。

    为什么这很重要?

    因为如果你隐藏依赖关系,你往往会失去耦合量。

    你可能会争辩说

    void purchaseLaptop(String creditCardNumber, int price){
      CreditCardProcessor.getInstance().debit(creditCardNumber, amount);
      Cart.getInstance().addLaptop();
    }
    

    比...更简单

    void purchaseLaptop(CreditCardProcessor creditCardProcessor, Cart cart, 
                        String creditCardNumber, int price){
      creditCardProcessor.debit(creditCardNumber, amount);
      cart.addLaptop();
    }
    

    但至少第二个API明确地说明了该方法的合作者究竟是什么。

    因此,解决方案Singletons的方法不是使用静态变量或服务定位器,而是将Singleton类更改为实例,这些实例在它们有意义的范围中实例化,并注入需要它们的组件和方法中。 您可以使用IoC框架来处理这种情况,或者您可以手动执行此操作,但重要的是摆脱您的全局状态并明确依赖关系和协作。


    我遇到的最好的解决方案是使用工厂模式来构建您的类的实例。 使用该模式,可以确保只有一个类的实例在使用它的对象之间共享。

    我虽然管理起来会很复杂,但在看过这篇博客文章“所有单身人士都去哪里?”之后,似乎很自然。 另外,这对隔离单元测试有很大的帮助。

    总之,你需要做什么? 每当一个对象依赖于另一个对象,它只会通过它的构造函数接收它的一个实例(在你的类中没有新的关键字)。

    class NeedyClass {
    
        private ExSingletonClass exSingleton;
    
        public NeedyClass(ExSingletonClass exSingleton){
            this.exSingleton = exSingleton;
        }
    
        // Here goes some code that uses the exSingleton object
    }
    

    然后,工厂。

    class FactoryOfNeedy {
    
        private ExSingletonClass exSingleton;
    
        public FactoryOfNeedy() {
            this.exSingleton = new ExSingletonClass();
        }
    
        public NeedyClass buildNeedy() {
            return new NeedyClass(this.exSingleton);
        }
    }
    

    因为你只会实例化你的工厂一次,所以会有一个exSingleton实例化。 每次调用buildNeedy时,NeedyClass的新实例都将与exSingleton捆绑在一起。

    我希望这有帮助。 请指出任何错误。

    链接地址: http://www.djcxy.com/p/82153.html

    上一篇: Are there any viable alternatives to the GOF Singleton Pattern?

    下一篇: Am I going crazy or is Math.Pow broken?