工厂设计模式及场景

一、概述

由策略模式进一步封装,演变成工厂模式。简单粗暴的理解就是把原来if else的判断逻辑封装成一层类。

二、应用场景

浏览论坛时,如果你是游客(未登录)的身份,通常只有帖子的阅读权限。当看到某篇感兴趣的帖子,想评论回帖时,系统会提示需要登录或注册会员。
当你注册成为会员后,就有了回帖的权限。随着时间的推移,你非常喜欢这个论坛,并想参与管理、维护该论坛,此时你需要管理员权限。管理员权限通常有删除垃圾贴的权限,这是普通会员无法使用的功能。
那么这个场景如何应用设计模式来解决呢?话不多说,Show you a code。

三、工厂模式

1.概念

一个工厂类拥有一个静态的方法,用来接收一些输入,并根据输入决定创建哪个类的实例。

2.代码示例

abstract class User {
    function __construct($name) {
        $this->name = $name;
    }

    function getName() {
        return $this->name;
    }

    function hasReadPermission() {
        return true;
    }

    function hasModifyPermission() {
        return false;
    }

    function hasDeletePermission() {
        return false;
    }

    function wantsFlashInterface() {
        return true;
    }
}

class GuestUser extends User {

}

class CustomerUser extends User {
    function hasModifyPermission() {
        return true;
    }
}

class AdminUser extends User {
    function hasModifyPermission() {
        return true;
    }

    function hasDeletePermission() {
        return true;
    }

    function wantsFlashInterface() {
        return false;
    }
}

class UserFactory {
    private static $users = array(
        'Andi' => 'admin',
        'Stig' => 'guest',
        'Derick' => 'customer', 
    );

    static function Create($name) {
        if (!isset(self::$users[$name])) {
            die("user not exist");
        }
        switch (self::$users[$name]) {
            case 'guest':
                return new GuestUser($name);
            case 'customer':
                return new CustomerUser($name);
            case 'admin':
                return new AdminUser($name);
            default:
                die('user not exist');
        }
    }
}

function boolToStr($b) {
    if ($b === true) {
        return 'Yes' . "\n";
    } else {
        return 'No' . "\n";
    }
}

function displayPermissions(User $obj) {
    print $obj->getName() . "'s permissions:\n";
    print 'Read: ' . boolToStr($obj->hasReadPermission());
    print 'Modify: ' . boolToStr($obj->hasModifyPermission());
    print 'Delete: ' . boolToStr($obj->hasDeletePermission());
}

function displayRequirements(User $obj) {
    if ($obj->wantsFlashInterface()) {
        print $obj->getName() . ' requires Flash' . "\n";
    }
}

$logins = array(
    'Andi',
    'Stig',
    'Derick',
);

foreach ($logins as $login) {
    displayPermissions(UserFactory::Create($login));
    displayRequirements(UserFactory::Create($login));
}

3.解析

  • 定义基类User,子类GuestUser、CustomerUser、AdminUser分别继承基类,并根据业务重写相应权限方法
  • 定义工厂类UserFactory,静态方法Create根据传入参数name的不同,创建不同子类的实例

发表评论

电子邮件地址不会被公开。 必填项已用*标注