何时隐藏具体类中的继承层次结构?

ins*_*pid 6 inheritance constructor types design-patterns factory

每当我遇到一个工厂将一个基于某种"低级"类型参数(如协议或外部资源的格式)的抽象基类实现返回给用户的情况时,我总是试图将其转换为将抽象类转换为具有内部"策略工厂"的具体类,以便用户可以将实现类型传递给构造函数并直接使用基类.

我注意到.Net框架选择以这种方式实现Socket(而不是创建一个DatagramSocket,你在构造时传递SocketType).有哪些指导方针可以决定何时将层次结构扁平化为像这样的单个具体类?

Hei*_*bug 3

我认为重点是:“客户应该了解多少底层细节?”。

如果您选择第一个解决方案(抽象基类),您将向客户端类隐藏更多详细信息。这样客户端可以完全忽略低级细节(协议、外部资源的格式)。当目标是完全隐藏实现细节和该实现中使用的类型时,我更喜欢这种方法。

否则,如果客户端已经知道低级实现的一些细节(例如客户端知道他将使用的套接字是 UDP 并且他也想知道此类信息),则可以用抽象基类方法代替内部“战略工厂”。