参数化单例模式
时间:2020-03-06 14:54:24 来源:igfitidea点击:
此处的链接列出了C#中的一些单例模式([http://www.yoda.arachsys.com/csharp/singleton.html][1])。本文还描述了一个显而易见的事实,即单例并不意味着要接受参数,否则,对于实例的第二个请求但具有不同的参数可能会出现问题。这意味着,使类正常工作所需的任何参数都应归为属性。
我很想知道是否有任何参数化的单例设计模式。接受值作为属性不会对消费者产生任何影响。
解决方案
根据问题,似乎我们正在查看一个Abstract Factory模式(创建几个类系列的实例),该模式保留一个已实例化的类的内部列表/字典,从而模仿了singleton模式的功能。
然后,我们将使用该工厂类根据传入的参数来请求对象,如果该对象存在于其内部列表中,则将其返回,否则,将创建一个新实例,然后将其添加到列表中并返回。
his means that any parameters you need to get the class working should be induced as a property.
理想情况下,单例类不应依赖于外部代码。
如果需要向单例构造函数提供其他信息,则可以仅创建对象池。
它可以是一个简单的列表,也可以是任何其他合适的数据结构。我们将需要使其成为线程安全的(如果有关系的话),并确保不会有多个使用相同参数实例化的对象。
基本上,我们将拥有一个班级工厂。对于相同的参数,它将返回相同的对象。
在这种情况下,我们将拥有N个单例对象,即状态不同的对象将被视为完全不同的实例。
我们可以在"控制反转"容器中找到此类单例的示例。
例如,我们可以拥有一些依赖于其他服务的服务。当我们调用container.Get(服务类型)时。 DI容器将使用所需参数自动初始化服务实例,并将其返回给调用方。但是,此服务实例将成为单例,我们将无法创建具有相同参数的另一个服务。