Я видел этот код по другому вопросу - второй ответ link, и первым комментарием было то, что он является статическим factory анти-шаблоном и что он нарушает 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);