C#基于不同类型创建类型的模式是什么?

时间:2011-03-30 08:22:05

标签: c# design-patterns

我有三个不同的对象作为创建对象A的输入。三个不同的对象是:

  • 的DataRow
  • 对象A(当我想创建副本时)
  • 对象B(看起来像对象A,但是不同而不是子类型)

现在我在对象A上有一个静态方法,如下所示:

public class ObjectA
{
   // class code

   public static ObjectA CreateFromType(DataRow row) {/*implementation */}
   public static ObjectA CreateFromType(ObjectA obj) {/*implementation */}
   public static ObjectA CreateFromType(ObjectB obj) {/*implementation */}
}

这是一个好方法吗?这是违反OCP的代码气味吗?你会如何实现这个?

4 个答案:

答案 0 :(得分:3)

为什么不提供适当的构造函数而不是工厂方法?是否存在ObjectA可以“默认创建”的第四种情况?

构造函数作为一种方法具有明显的优势,因为当有人即将创建一个时,它们是ObjectA的公共接口中最明显的部分。如果要以你提到的方式之一创建实例的主要场景,我会强烈建议构造函数。

特别提到“克隆”构造函数:如果你的程序集中有其他可克隆的类,那么定义你自己的IClonable派生词以及定义明确的语义(浅或深)可能是有意义的克隆)并使用该方法而不是复制构造函数。

答案 1 :(得分:3)

为什么不在ObjectA上创建不同的构造函数?还是显式或隐式运算符?在你的情况下我不认为需要静态方法。

答案 2 :(得分:2)

看起来不错,不过你也可以使用构造函数

public class ObjectA
{
   // class code

   public ObjectA(DataRow row) {/*implementation */}
   public ObjectA(ObjectA obj) {/*implementation */}
   public ObjectA(ObjectB obj) {/*implementation */}
}

答案 3 :(得分:0)

可以自己创建ObjectA并独立初始化吗?我倾向于让你的构造函数没有这种数据传输,而是创建对象方法来初始化3种不同场景的数据。

如果您希望从ObjectA继承并专门化数据传输,这也可以提高灵活性。