我在另一个问题上看到了这段代码 - 第二个答案链接,第一条评论是它是一个静态工厂反模式并且它违反了 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);
现在我可以理解为什么它违反了 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);
现在我没有使用静态方法,但我的 oop 是否仍会被视为反模式?
特别是因为我真的看不出做这样的事情有什么不同,而且几乎是一回事:
$result=DatabaseClass::getUser($username,$password);
$user=UserFactory::createUser($result);