这种设计模式有很大的意义吗?我原来有一个静态类,它为每个实现的算法返回一个HashFunction
。有没有更好的方法来伪造静态类接口?
public delegate int HashFunction(int seed, params int[] keys);
但后来我意识到,我想几件的元数据与每个算法一起,所以我创造了这个接口:
public interface IHashAlgorithm
{
HashFunction CalculateHash { get; }
NoiseFunction CalculateNoise { get; }
int Maximum { get; }
int Minimum { get; }
}
一个内部类实现所需的接口:
public delegate double NoiseFunction(int seed, params int[] keys);
internal sealed class HashAlgorithm : IHashAlgorithm
{
public HashAlgorithm(HashFunction function, int min, int max)
{
CalculateHash = function;
Minimum = min;
Maximum = max;
}
public HashFunction CalculateHash { get; private set; }
public NoiseFunction CalculateNoise
{
get { return Noise; }
}
public int Maximum { get; private set; }
public int Minimum { get; private set; }
private double Noise(int seed, params int[] keys)
{
return ((double)CalculateHash(seed, keys) - Minimum)/
((double)Maximum - Minimum + 1);
}
}
创建并返回一种公共静态工厂类:
public static class Hashing
{
private static readonly IHashAlgorithm MurmurHash2Instance =
new HashAlgorithm(MurmurHash2Hash, 0, int.MaxValue);
private static readonly IHashAlgorithm ReSharperInstance =
new HashAlgorithm(ReSharperHash, int.MinValue, int.MaxValue);
public static IHashAlgorithm MurmurHash2
{
get { return MurmurHash2Instance; }
}
public static IHashAlgorithm ReSharper
{
get { return ReSharperInstance; }
}
private static int MurmurHash2Hash(int seed, params int[] keys)
{
//...
}
private static int ReSharperHash(int seed, params int[] keys)
{
//...
}
}
我宁愿能够在静态类每种算法实现IHashAlgorithm
:
public static class MurmurHash2 : IHashAlgorithm
{
public static int Hash(int seed, params int[] keys) {...}
//...
}
不幸的是C#不允许这样,所以这是我在它周围越来越尝试。
我想你应该使用make一个singleton,如果你需要模拟“静态接口”,这看起来像你在做什么,但以一种奇怪的方式。 – Candide
Ingenu是正确的 - 单身是唯一的方法来做到这一点。如果您想严格控制API,您当然可以选择明确的接口实现。 –