我在另一个问题上看到了这个代码 - 第二个答案链接,第一个评论是它是一个静态工厂反模式,它违反了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)
不,这不是反模式.就个人而言,每当我看到它时,我都会用一粒盐"反模式"这个词.对于那些不喜欢你的代码却无法真正阐明原因的人来说,它太容易被抛弃.
静态工厂的问题是任何使用工厂的类都必须明确依赖它.这违反了我们应该依赖于抽象而不是结核的原则(SOLID中的'D').这使得使用工厂的代码更难以重复使用和单元测试.但请记住,这种方法也有好处.它更容易编写,更容易理解.
您的代码等同于静态工厂方法.两种情况下的问题是调用者必须知道工厂的具体类.
| 归档时间: |
|
| 查看次数: |
2184 次 |
| 最近记录: |