別の質問でこのコードを見ました-2番目の回答リンクと最初のコメントは、それが静的な工場のアンチパターンであり、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);