通用基类包装嵌套generics类以减少类型参数规范:此模式是否有名称?

好的问题标题远非不言自明。 我看到自己经常这样做:

从这个答案 :

public static class Equality { public static IEqualityComparer CreateComparer(Func keySelector) { return new KeyEqualityComparer(keySelector); } class KeyEqualityComparer : IEqualityComparer { readonly Func keySelector; public KeyEqualityComparer(Func keySelector) { this.keySelector = keySelector; } public bool Equals(T x, T y) { ---- } public int GetHashCode(T obj) { .... } } } 

我做了什么:我必须调用一个实现细节KeyEqualityComparer

 new KeyEqualityComparer(p => p.ID); 

通过将其嵌套为私有类,我不仅隐藏了实现(内部类的公共构造函数现在也很模糊),而是获得了更好的语法:

 Equality.CreateComparer(p => p.ID); 

请注意,我没有从父类inheritance嵌套类(这是静态的)。

或者有时我看到自己这样做 :

 public abstract class Equater : IEqualityComparer { public static Equater Create(Func keySelector) { return new Impl(keySelector); } public abstract bool Equals(T x, T y); public abstract int GetHashCode(T obj); class Impl : Equater { readonly Func keySelector; public Impl(Func keySelector) { this.keySelector = keySelector; } public override bool Equals(T x, T y) { ---- } public override int GetHashCode(T obj) { .... } } } 

这里有另一个类似的

 public class Accessor { public static Accessor Create(Expression<Func> memberSelector) { return new GetterSetter(memberSelector); } class GetterSetter : Accessor { public GetterSetter(Expression<Func> memberSelector) : base(memberSelector) { } } } public class Accessor : Accessor { Func Getter; Action Setter; public bool IsReadable { get; private set; } public bool IsWritable { get; private set; } public T this[S instance] { get { if (!IsReadable) throw new ArgumentException("Property get method not found."); return Getter(instance); } set { if (!IsWritable) throw new ArgumentException("Property set method not found."); Setter(instance, value); } } protected Accessor(Expression<Func> memberSelector) //access not given to outside world { ---- } } 

请注意,在这两种情况下,我从包装类inheritance。 所以现在我不仅得到了前者的好处,而且还可以维护这样的列表:

 List<Equater> { persons with different implementations }; 

它不时地帮助我。 所以我很想知道这个模式是否有名字?

我认为这很像Class Clusters模式 ,它基于抽象工厂模式。

我不认为你在这里遵循任何一种模式。

我想说,通过用一个“Create”方法替换多个“CreateComparer”方法,您刚刚简化了一个Creation Method模式。 从某种意义上说,你可以说这是一种工厂模式?! 或者也许是一个Builder模式 – 我想这个解释是开放的吗?!

通过在“Equater”中嵌入“Impl”,你可以按照Command模式 – 封装方法调用,这样你的调用代码就不知道它是如何完成的。

无论如何,抱歉,我不能比这更有帮助或给你一个明确的答案! 无论如何,希望它有所帮助!

正如Bertie正确指出的那样,我可能没有遵循任何一种模式。

我会说通过将具体实现的实例化委托给CreateComparer方法,我刚刚简化了对象创建 – 它来自Creation Method模式 。 通过具有用于对象实例化的静态函数,它是一种工厂模式 – 特别是工厂方法的这种变体 。

通过从EquaterinheritanceImpl ,我有点跟随抽象工厂模式 – 其中Equater是工厂的工厂, Impl是它的实现,让Impl本身回来,除了Impl真的没有创建任何其他对象(换句话说, Impl不是意味着成为一个工厂),但通过构造函数实现自己 。 因此从严格意义上说,它不是抽象工厂模式,但如果Impl可以有一个方法来调用自身的构造函数并返回一个实例,那么它将更接近。

此外,通过嵌入和隐藏实现细节(嵌套类本身),暴露的类(父类)伪造到外部世界,好像它正在做它的工作。 这就是所谓的委托模式

对于在嵌套generics类中隐藏generics类的实现的名称, 为方法调用提供更容易的签名,我不认为存在一个。 即使存在任何名称,它也必须非常特定于语言(或类似语言),因为涉及诸如generics/类型推断等语言构造。 Eric Lippert在嵌套类中发现了相同的用法,尽管它不是generics相关的,他将其称为Factory模式。