C# 返回相同实例的工厂模式

C# 返回相同实例的工厂模式,c#,design-patterns,factory,C#,Design Patterns,Factory,让我们以一个用C#编写的“工厂”类为例: 这里的问题是这个类的命名约定。工厂建议CreateHasher的每次执行都将返回一个新实例,但事实并非如此。这里使用的模式叫什么?在总是返回相同实例的情况下,它叫单例模式。。。这相当于两个单重态——一个双重态 不过我会使用“Get”(这是单例的标准,如GetInstance()。在本例中,它将是GetHasher(“sha1”)Get vs create?你的问题是什么?这是一个单例模式。它是一个反模式,很像工厂模式。@DetectivePikachu,

让我们以一个用C#编写的“工厂”类为例:


这里的问题是这个类的命名约定。工厂建议CreateHasher的每次执行都将返回一个新实例,但事实并非如此。这里使用的模式叫什么?

在总是返回相同实例的情况下,它叫单例模式。。。这相当于两个单重态——一个双重态


不过我会使用“Get”(这是单例的标准,如GetInstance()。在本例中,它将是GetHasher(“sha1”)

Get vs create?你的问题是什么?这是一个单例模式。它是一个反模式,很像工厂模式。@DetectivePikachu,你的意思是它是一个恰好看起来像工厂的反模式;或者它是一个反模式,就像工厂是一个反模式一样?它是一个反模式,就像工厂是一个反模式一样。这是通过依赖注入实现了更具弹性的双倍模式是单模式的一半好,但是FrBeLeTon模式仅为1/第四好。我不认为这是单模式的实现,因为Sa1HasHER和Sa2HasHER被传递到类中。在整个应用程序中没有创建它们的多个实例。我也不认为这是工厂模式的实现,因为没有创建任何东西。这就是为什么我称它为“Doubleton”,但你是对的,它不是单例。也许最好称它为“Holder”。不过,作为Holder,GetHasher或只是Get()会是个更好的名字。
public class HasherFactory : IHasherFactory
{
    private readonly Sha1Hasher _sha1Hasher;
    private readonly Sha2Hasher _sha2Hasher;

    public HasherFactory(Sha1Hasher sha1Hasher, Sha2Hasher sha2Hasher)
    {
        _sha1Hasher = sha1Hasher;
        _sha2Hasher = sha2Hasher;
    }

    public IHasher CreateHasher(string hashAlgorithm)
    {
        switch (hashAlgorithm.ToLower())
        {
            case "sha1":
                return _sha1Hasher;
            case "sha2":
                return _sha2Hasher;
            default:
                throw new ArgumentException("Invalid hash algorithm", nameof(hashAlgorithm));
        }
    }
}