7

我有一个工厂类,DocumentLoaderFactory它只是返回一个实现接口的实例,IDocumentLoader

所有实现都位于以下命名空间下

Skim.Ssms.AddIn.ActiveFileExplorer.Loader

但我想知道的是,DocumentLoaderFactory属于哪个命名空间?我现在已将工厂类放在*.Loader命名空间下,但它是从ActiveFileWindow父命名空间的用户控件 () 中使用的,Skim.Ssms.AddIn.ActiveFileExplorer如下所示。

*.Loader将工厂方法放置在或其父命名空间中的利弊是什么?我想根据利弊做出决定。



这是我的项目的布局 替代文字

4

3 回答 3

10

我会说最好将您的工厂与他们创建的类型放在一起。工厂是某种东西的提供者,应该与其提供的东西相关联并与之接近。如果您遵循凝聚力规则,那么您将得出相同的结论。相关的东西应该紧密联系在一起以保持一个有凝聚力的 API。

于 2009-08-24T00:30:51.423 回答
5

因为使用工厂需要的代码完全不知道抽象工厂模式中的实现,所以我通常将接口和工厂(加上任何类型信息)放在根目录下,然后将实现放在自己的文件夹(或文件夹如果很少有)。

所以在你的情况下,我有类似的东西:

Loader
- DocumentLoaderFactory
- DocumentLoadType
- IDocumentLoader


Loader\Implementation
- NameDocumentLoader
- TypeDocumentLoader
- ConnectionDocumentLoader
- DocumentLoader

我假设 DocumentLoader 是一个抽象基类,由于它的名称,它继承了你的接口,但你明白了。我不知道你的其他类“TreeViewImageIndex”是做什么用的,但如果合适的话,你可以把它放在任何一个地方或完全不同的地方。

这使您的代码保持美观和凝聚力,不需要您的实现类了解 Loader\Implementation 命名空间,并使您的文档树更易于阅读。

于 2009-08-24T01:09:15.320 回答
2

我会说将它留在 **.Loader* 命名空间中,因为在使用IDocumentLoader实现时它会更容易找到。

于 2009-08-24T00:28:12.047 回答