我目前正在用PHP完成一个项目,但OO的一般原则仍然适用。

我有一个名为Node的父类,它是抽象的 - 即它无法实例化。 有许多类可以扩展Node,并且是可实例化的。 其中一些包括事件,人员和项目。

我遇到的问题是我经常需要实例化一个Node而不知道它将是哪个子类。 所有Node和node-sub-class始终将相同类型的对象(来自数据库的一行)作为构造函数的参数。 为了解决不知道我需要什么类型的实现类的问题,我创建了一个简单的静态类,它将返回正确的节点子类。 此代码的示例如下:

<?php

class NodeClassRegistry{

    public static function init_class($node) {
        switch ($node->type) {
            case 'person':
                return new Person($node);

            case 'event':
                return new Event($node);
        }
    }

}

?>

对我来说,这似乎是一个非常糟糕的设计 - 它是一种工厂模式,但它似乎真的与全球状态联系在一起。 是否有适合这种情况的设计模式?

===============>>#1 票数:2 已采纳

您所做的是一种特殊类型的工厂方法设计模式 GoF书中此子类型的C ++示例如下:

class Creator {
public:
  virtual Product* Create(ProductId id);
}

Product* Creator::Create(ProductId id) {
  if (id == MINE) return new MyProduct;
  if (id == YOURS) return new YourProduct;
  ...
  return 0;
}

===============>>#2 票数:0

这是抽象工厂设计模式,这很依赖于某种type字段/变量来检查工厂应该创建哪种基础类型的实例。 请参阅Java语言中的Abstract Factory实现示例,它从配置文件中读取全局变量...

===============>>#3 票数:0

在C#中,我会将完整的类名存储在一列中,并使用反射创建它。 如果我的记忆正确,我可以应用“约定优于配置”,即:

创建名称等于type column中的值的类

然后,以这种方式创建一个函数:

public static function init_class($node) {
    $item = NULL;
    eval "\$item = new " . $node->type . "(\$node);"
    return $item;
}

  ask by rybosome translate from so

未解决问题?本站智能推荐:

关注微信公众号