首先,簡單介紹下工廠模式:php
在大型系統中,許多代碼依賴於少數幾個關鍵類。須要更改這些類時,可能會出現困難。例如,假設您有一個從文件讀取的 User 類。您但願將其更改成從數據庫讀取的其餘類,可是,全部的代碼都引用從文件讀取的原始類。這時候,使用工廠模式會很方便。web
工廠模式 是一種類,它具備爲您建立對象的某些方法。您可使用工廠類建立對象,而不直接使用 new。這樣,若是您想要更改所建立的對象類型,只需更改該工廠便可。使用該工廠的全部代碼會自動更改。數據庫
一、首先,咱們來實現一個簡單的工廠模式,代碼以下:設計模式
<?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();
二、工廠模式有了,可是這樣的工廠模式調用不是很方便,每次都須要去new,而後咱們能夠採用靜態調用的方式,這樣就不須要每次都去new一下了,而且調用更加方便app
<?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進行調用。yii
三、那麼Yii2中的登陸又是如何的乃?ui
<?php namespace app\models; use Yii; class User extends \yii\base\Object implements \yii\web\IdentityInterface
這段代碼是Yii2中的User模型中的代碼,這裏使用了接口IdentityInterface類,細心的朋友會去查看\yii\web\IdentityInterface中的代碼,這就是一個標準的接口this
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中便可看到。部分代碼以下:spa
<?php namespace app\models; class User extends \yii\base\Object implements \yii\web\IdentityInterface { public $id; public $username; public $password; public $authKey; public $accessToken; private static $users = [ '100' => [ 'id' => '100', 'username' => 'admin', 'password' => 'admin', 'authKey' => 'test100key', 'accessToken' => '100-token', ], '101' => [ 'id' => '101', 'username' => 'demo', 'password' => 'demo', 'authKey' => 'test101key', 'accessToken' => '101-token', ], ]; /** * @inheritdoc */ public static function findIdentity($id) { return isset(self::$users[$id]) ? new static(self::$users[$id]) : null; } /** * @inheritdoc */ public static function findIdentityByAccessToken($token, $type = null) { foreach (self::$users as $user) { if ($user['accessToken'] === $token) { return new static($user); } } return null; } ......
Yii2中的使用是很是靈活的,而且繼承了\yii\base\Object。設計
總結:工廠模式是設計模式中的一種很經常使用的設計模式,在不少大型應用中很是常見。Yii2中還有不少地方使用了工廠模式,好比依賴注入DI等,有興趣的童鞋能夠了解下。