你有这些方法的工厂吗?类型或工厂的静态方法?

时间:2009-06-17 02:52:31

标签: c# refactoring

对不好的标题抱歉我只是不知道如何正确说出来。

假设我有一个名为Table的类和这三种方法:

//Creates a new table in underlying provider and returns new Table object.
CreateNew(string Name); 
//Opens the table in provider and returns new Table object.
OpenTable(string Path);
//Same action as above just on a collection, and returns a IList<Table>
OpenTables(IList<string> path);

目前我正在使用类似的东西,其中所有方法都是静态的类型:

Table tab = Table.OpenTable("SomePath");
Table tab = Table.CreateNew("DummyTableName");

你明白了。

但是我想知道这些是否真的应该在工厂里。像这样:

 TableFactory factory = new TableFactory();
 Table tab = factory.CreateNew("DummyTableName");
 Table tab = factory.OpenTable("SomePath");

工厂不会是静态的,因为这会使使用工厂的其他代码难以测试

您怎么看?

3 个答案:

答案 0 :(得分:1)

这取决于你想要达到的目标。如果使用工厂,您可以获得更好的控制反转,因此您可以为测试期间使用的Table创建一个Test实现,这样可以对单元测试进行更精细的控制。

如果您的工厂使用无处不在,您可以在测试模式下将其替换为TestTable工厂。

答案 1 :(得分:1)

使用工厂的主要原因是将对象的创建与其使用分离。由于您只是使用不同的参数创建Table对象,因此我认为将静态创建方法从Table类本身中删除会更有意义。

答案 2 :(得分:0)

您是否考虑过:

var tab = new Table("tableName");

var tablePath = new TablePath("SomeTablePath");
var tab = new Table(tablePath);

OTOH,如果你想要一个工厂和所有可以提供给你的解耦,我会提取一个表接口,并让工厂返回接口。