我有一个工厂类DocumentLoaderFactory
,它只返回一个实现接口IDocumentLoader
的实例。
所有实现都位于以下命名空间
下Skim.Ssms.AddIn.ActiveFileExplorer.Loader
但令我疑惑的是,DocumentLoaderFactory
属于哪个命名空间?
我现在已将工厂类放在*.Loader
命名空间下,但它正在父命名空间ActiveFileWindow
的用户控件(Skim.Ssms.AddIn.ActiveFileExplorer
)中使用,如下所示。
什么是专业人士和专业人士将工厂方法放在*.Loader
或它的父命名空间中的缺点?我想根据优点/缺点做出的决定。
这是我项目的布局
答案 0 :(得分:8)
我会说最好将你的工厂与他们创造的类型共存。工厂是某种东西的提供者,应该与它提供的东西相关联和接近。如果你遵循凝聚力的规则,那么你会得出同样的结论。相关的事情应该紧密结合在一起,以维持一个有凝聚力的API。
答案 1 :(得分:5)
因为使用工厂需要的代码完全不了解抽象工厂模式中的实现,所以我通常将接口和工厂(加上任何类型信息)放入根目录,然后将实现放入自己的文件夹中(或文件夹,如果有少数)。
所以在你的情况下,我有类似的东西:
Loader
- DocumentLoaderFactory
- DocumentLoadType
- IDocumentLoader
Loader\Implementation
- NameDocumentLoader
- TypeDocumentLoader
- ConnectionDocumentLoader
- DocumentLoader
我假设DocumentLoader是一个抽象的基类,由于它的名字而继承了你的接口,但是你明白了。我不知道你的其他类是什么“TreeViewImageIndex”,但你可以将它放在任何一个地方或某个完全不同的地方(如果合适的话)。
这使您的代码保持良好和凝聚力,不需要您的实现类了解Loader \ Implementation命名空间,并使您的文档树更易于阅读。
答案 2 :(得分:2)
我想将它保留在**。Loader *命名空间中,因为它可以使您在使用 IDocumentLoader 实现时更容易找到。