标签:
首先,简单介绍下工厂模式:
在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。
工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。
1、首先,我们来实现一个简单的工厂模式,代码如下:
<?php /* * PHP设计模式 * 工厂模式 */ /** * 接口 */ interface Iuser { function getName(); function getAge(); } /** * 接口实现 */ class User implements Iuser { public $uid; public $user_list = array( ‘1‘ => array( ‘name‘ => ‘ken‘, ‘age‘ => ‘32‘ ), ‘2‘ => array( ‘name‘ => ‘nices‘, ‘age‘ => ‘13‘ ), ); public $user; public function __construct($uid) { $this->uid = $uid; if (in_array($uid, array(1, 2))) { $this->user = $this->user_list[$uid]; } } public function getName() { return $this->user[‘name‘]; } public function getAge() { return $this->user[‘age‘]; } } class Studenty { public function getInfo($uid) { return new User($uid); } } $studenty = new Studenty(); $sInfo = $studenty->getInfo(2); echo $sInfo->getName(); echo $sInfo->getAge();
2、工厂模式有了,但是这样的工厂模式调用不是很方便,每次都需要去new,然后我们可以采用静态调用的方式,这样就不需要每次都去new一下了,并且调用更加方便
<?php /* * PHP设计模式 * 工厂模式变种 */ interface Iuser { public function getName(); public function getAge(); } class User implements Iuser { public $uid; public $user_list = array( ‘1‘ => array( ‘name‘ => ‘ken‘, ‘age‘ => ‘32‘ ), ‘2‘ => array( ‘name‘ => ‘nices‘, ‘age‘ => ‘13‘ ), ); public $user; public static function Load($uid) { return new User($uid); } public function __construct($uid) { if (in_array($uid, array(1, 2))) { $this->uid = $uid; $this->user = $this->user_list[$uid]; } } public function getName() { return $this->user[‘name‘]; } public function getAge() { return $this->user[‘age‘]; } } $user = User::Load(2); echo $user->getName();
通过这样的工厂模式,我们可以很方便的使用静态方法User::Load进行调用。
3、那么Yii2中的登录又是如何的乃?
<?php namespace app\models; use Yii; class User extends \yii\base\Object implements \yii\web\IdentityInterface
这段代码是Yii2中的User模型中的代码,这里使用了接口IdentityInterface类,细心的朋友会去查看\yii\web\IdentityInterface中的代码,这就是一个标准的接口
interface IdentityInterface { /** * 为了减少篇幅,我去掉了注释,这段代码可以从Yii2中获取 */ public static function findIdentity($id); public static function findIdentityByAccessToken($token, $type = null); public function getId(); public function getAuthKey(); public function validateAuthKey($authKey); }
User模型使用了该接口,那么久必须要进行一些方法的声明使用,在app\models\User中即可看到。部分代码如下:
<?php namespace app\models; use Yii; class User extends \yii\base\Object implements \yii\web\IdentityInterface { public $id; public $username; public $email; public $password; public $status; public $authKey; public $accessToken; public $created_at; public $updated_at; /** * @inheritdoc */ public static function findIdentity($id) { $user = self::findById($id); if ($user) { return new static($user); } return null; } /** * @inheritdoc */ public static function findIdentityByAccessToken($token, $type = null) { $user = Users::find()->where(array(‘accessToken‘ => $token))->one(); if ($user) { return new static($user); } return null; } ......
Yii2中的使用是非常灵活的,并且继承了\yii\base\Object。
总结:工厂模式是设计模式中的一种很常用的设计模式,在很多大型应用中非常常见。Yii2中还有很多地方使用了工厂模式,比如依赖注入DI等,有兴趣的童鞋可以了解下。
标签:
原文地址:http://my.oschina.net/kenblog/blog/419769