何时将factory()方法放入factorid对象并将factory()方法放入分离的类?

时间:2011-04-08 14:16:17

标签: php

factory()方法放到factoried对象的类中是否可以?

class User {

    public static function factory($id) {
       return new User($id);
    }

    private function __construct($id) {

    }

}

考虑将factory()方法放入分离的类中?

class User {

    public function __construct($id) {

    }

}

class UserFactory {

    public static function factory($id) {
        return new User($id)
    }

}

我看不到在工厂使用额外课程有什么好处,但我认为有一些我不知道的好处。 :)

何时将factory()方法放入分解对象并将factory()方法放入分离的类?

3 个答案:

答案 0 :(得分:1)

将工厂方法放在类本身中的优点是保护类不被实例化而不使用工厂方法:

class User {

    public static function factory($id) {
       return new User($id);
    }

    private function __construct($id) {
        // Now, only the factory method within this class can call this method.
        // (Additionally, this method was static, which it shouldn't.)
    }

}

我让其他人加入相反的解决方案的优势。

答案 1 :(得分:0)

如果你有一个静态创建者方法,那么在投入工厂时没有太大用处。


如果不是静态并且你想将它注入某个地方,那么将工厂方法放在它自己的类中是非常有用的。

class User {

    public static function __construct($id) {

    }

}

class UserFactory {

    public function factory($id) {
        return new User($id)
    }

}

class SomethingUserReleated {
    public function __construct(UserFactory $factory) {
        $this->userFactory = $factory;
    }

    public function iNeedToCreateAnUserForSomething() {
        $userOne = $this->userFactory->factory(1233);
        $userTwo = $this->userFactory->factory(123533);
    }
}

既然你不能用静态方法来上面。

答案 2 :(得分:0)

将工厂方法移动到单独的类中允许您分离对象方法和工厂特定方法(仅在创建新对象时需要)。

class User {
  public static function __construct($id, $name){
    // call this directly or via Factory
  }
}

class UserFactory {
  private static function randomName(){
    // return some random name
  }

  public static function factory($id){
    return new User($id, UserFactory::randomName());
  }
}