我的工厂是反模式吗?

mrm*_*ryb 11 php oop

我在另一个问题上看到了这个代码 - 第二个答案链接,第一个评论是它是一个静态工厂反模式,它违反了SRP:

class User {
    public static function create($userid) {
        // get user from the database

        // set $isPartner to true or false
        // set $isClient to true or false
        // set $isModerator to true or false

        if ($isPartner) {
            return new Partner($userid);
        } elseif ($isClient) {
            return new Client($userid);
        } elseif ($isModerator) {
            return new Moderator($userid);
        } else {
            return new User($userid);
        }
    }
}

$person = User::create($userid);
Run Code Online (Sandbox Code Playgroud)

现在我可以理解为什么它违反了SRP - 因为它处理连接到数据库以及构建新类,但除此之外我不确定我是否理解为什么它是反模式.

我想编写一些与此类似的代码,所以我现在想知道是否要避免它,这是我的代码(伪代码):

class DatabaseClass()
{
...deals with getting a result from the database...
}

abstract class User()
{
...base class for all users...
}

class AdminUser extends User(){}
class StaffUser extends User(){}
class BasicUser extends User(){}

class UserFactory()
{
    function createUser($privilege)
    {
        if($privilege=="high")
            return new AdminUser($privilege);
        else if($privilege=="med")
            return new StaffUser($privilege);
        else
            return new BasicUser($privilege);
    }

$db=new DatabaseClass($username,$password);
$result=$db->getUser();
$userfactory=new UserFactory();
$user=$userfactory->createUser($result);
Run Code Online (Sandbox Code Playgroud)

现在,我现在没有使用静态方法,但我的oop仍然被认为是反模式?

特别是因为我没有看到任何差异,然后做这样的事情,它几乎是相同的事情:

$result=DatabaseClass::getUser($username,$password);
$user=UserFactory::createUser($result);
Run Code Online (Sandbox Code Playgroud)

Pet*_*man 8

不,这不是反模式.就个人而言,每当我看到它时,我都会用一粒盐"反模式"这个词.对于那些不喜欢你的代码却无法真正阐明原因的人来说,它太容易被抛弃.

静态工厂的问题是任何使用工厂的类都必须明确依赖它.这违反了我们应该依赖于抽象而不是结核的原则(SOLID中的'D').这使得使用工厂的代码更难以重复使用和单元测试.但请记住,这种方法也有好处.它更容易编写,更容易理解.

您的代码等同于静态工厂方法.两种情况下的问题是调用者必须知道工厂的具体类.