有没有任何可行的替代GOF Singleton模式?
面对现实吧。 Singleton模式是一个非常有争议的话题,围绕着围栏两侧的群体程序员。 有些人认为辛格尔顿不仅仅是一个荣耀的全球变量,而且还有那些依靠模式发誓并不断使用它的人。 然而,我不希望辛格尔顿论战成为我问题的核心。 每个人都可以进行拔河比赛,看看谁赢得了我所关心的一切 。 我想说的是,我不相信有一个正确的答案,我不是故意尝试激怒党派争吵。 当我问这个问题时,我只是对单例替代品感兴趣:
他们是否是GOF Singleton Pattern的特定替代品?
例如,很多时候,当我过去使用单例模式时,我只想保存一个或多个变量的状态/值。 但是,变量的状态/值可以使用静态变量在类的每个实例化之间保留,而不是使用单例模式。
你有什么其他想法?
编辑:我真的不希望这是另一篇关于“如何正确使用单身人士”的文章。 再次,我正在寻找方法来避免它。 为了好玩,好吗? 我想我在你最好的电影预告片声音中提出纯粹的学术问题,“在一个没有单身的平行宇宙中,我们能做什么?”
Alex Miller在“Patterns I Hate”中引用了以下内容:
“当一个单身人士看起来像是答案时,我发现通常更聪明的是:
要理解解决单身人士的正确方法,您需要了解单身人士(以及一般的全局国家)的问题:
单身人士隐藏依赖关系。
为什么这很重要?
因为如果你隐藏依赖关系,你往往会失去耦合量。
你可能会争辩说
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?