我知道C ++中的单例模式,但是如何获得对象的两个实例? 有没有这样的模式,我们可以很容易地得到两个对象?
我能想到的逻辑是我可以改变单例模式本身,在类中创建两个对象。这是有效的,但如果需求增长就像我需要3个或只有4个对象一样,那么哪种设计模式可以满足这样的要求呢?
答案 0 :(得分:9)
在软件设计中,主体是“只有三个数字:0,1和无穷大”,意味着任意限制都很糟糕。有时只有一个资源(例如日志文件)有充分的理由。一旦你有多个,任何任意限制最终都会成为一个问题。因此,如果您需要多个资源或对象,您将需要一个可以包含任意数字的池。您还需要一些方法来选择从池中分配哪个资源。
答案 1 :(得分:7)
如果你能真正为这种模式提出引人注目的用例,我会很难受。正如你已经提到的那样,一般共识已经转移到单身人士作为反模式:很难将其概括为更多实例并且与全局变量没有区别(我们已经将其建立为反模式,对吗?)
也许你应该考虑你的设计或提出一个令人信服的例子。
答案 2 :(得分:6)
class myclass {...};
myclass obj1;
myclass obj2;
有时,简单的方法确实是最好的。 您不需要强制执行,只能存在一个,两个,十三个或七十八个实例。
如果您需要两个实例,只需创建两个实例。
答案 3 :(得分:1)
这似乎更像是对象池的需求,尝试远离全局对象。
答案 4 :(得分:1)
只有一个物体才有特定的优点。仅举一个例子,即使在多线程环境中,如果您可以保证只有一个对象可以访问某些数据(即该类的私有数据),那么您可以在不使用互斥锁/关键字的情况下修改数据节/不管。只要您允许多个对象(无论您选择其他任何数字),您都会失去使单身人士感兴趣的基本品质。
几乎任何其他数字都会产生类似固定大小的集合。如果需要支持多线程环境,可以使用计数的信号量来控制对象的创建。否则,您可能会使用类似对象数组的内容,并使用互斥锁控制对每个对象的访问。
如果您不需要支持多线程,那么一个简单的计数器就足够了。
答案 5 :(得分:1)
为什么不创造两个单身人士? ;)
答案 6 :(得分:0)
单身设计模式根据GoF书中的定义创建了一个只有一个实例的对象。一个例子是表示系统时钟的单例;在这种情况下,每个表示时钟的多个对象都没有意义。
也许可以实现某种工厂方法来创建Singleton对象,最多可以使用固定数字。但我认为这远远超出原始设计模式的规范。
也许看看Alexandrescu的“现代C ++设计” - 它有一个关于单身人士的精彩章节。
答案 7 :(得分:0)
为什么不使用数组(如果大小是静态的)或List(如果大小不是静态的)?
我同意0,1或无穷大的情绪;但是,从纯粹的实现角度来看,这是一个完美的数组用例。您甚至可以为数组创建一个包装器,这样消费者就不会知道您正在使用数组。我可以在排队或汇集场景中看到这种用法。
答案 8 :(得分:0)
如果您需要同一对象的多个实例,则可以使用对象池。
如果需要许多Singleton对象的地图,可以使用Multiton模式。