PHP設計模式之工廠模式詳解

更新:2017-10-27    編輯:冰寒    來源:GeGuai.com    人氣:加載中...    字號:|

在開發大型系統時,往往會出現這樣一種情況:

我有一部分根基數據,是類classA是從數據庫A讀取出來的,其他很多的功能都是基于這個根基數據來操作的,F在呢,我想把數據從數據庫A變成從另外的數據源去獲取,這時候,要改動起來就對比麻煩,要改動其他很多類的代碼。這種設計顯然是不夠靈便的,,換句話說,就是緊耦合的,那么什么是緊耦合呢?緊耦合就是指系統中某個部分的函數或類嚴重依附于系統的其他部分中的函數或類的行為和結構。

這時,工廠模式的作用性就體現出來了。

工廠模式    

就是解決這樣的一些情況的設計法子。

工廠模式是一種類,建立了一個工廠來根據所需來創建對象,這種方式在多態性編程中是很首要的,允許動態調換類,改動配置等。

/*基本工廠模式代碼*/

<?php /** * 基本工廠模式 * */ class User { private $username; public function __construct($username) { $this->username = $username; } public function getUser() { return $this->username; } } class userFactory { static public function createUser() { return new User('Jack'); } } $user = userFactory::createUser();echo $user->getUser(); ?>

工廠模式分為:簡單工廠模式、工廠法子模式、抽象工廠模式。

簡單工廠模式,通過靜態法子創建對象?梢岳斫獬,只負責生產同一等級結構中的任何一個產品,但是不能新增產品。

<?php /** *簡單工廠模式 * */ interface userProperties { function getUsername(); function getGender(); function getJob(); } class User implements userProperties{ private $username; private $gender; private $job; public function __construct($username, $gender, $job) { $this->username = $username; $this->gender = $gender; $this->job = $job; } public function getUsername() { return $this->username; } public function getGender() { return $this->gender; } public function getJob() { return $this->job; } } class userFactory { static public function createUser($properties = []) { return new User($properties['username'], $properties['gender'], $properties['job']); } } $employers = [ ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'], ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'], ]; $user = userFactory::createUser($employers[0]); echo $user->getUsername(); ?>

工廠法子模式,去掉了簡單工廠模式中法子的靜態屬性,使其可以被子類集成,定義一個創建對象的接口,讓子類去抉擇實例化哪個類?梢岳斫獬,用來生產同一等級結構中的固定產品,但是支持增加產品。

<?php /** * 工廠法子模式 **/ interface userProperties { function getUsername(); function getGender(); function getJob(); } interface createUser { function create($properties); } class User implements userProperties{ private $username; private $gender; private $job; public function __construct($username, $gender, $job) { $this->username = $username; $this->gender = $gender; $this->job = $job; } public function getUsername() { return $this->username; } public function getGender() { return $this->gender; } public function getJob() { return $this->job; } } class userFactory { private $user; public function __construct($properties = []) { $this->user = new User($properties['username'], $properties['gender'], $properties['job']); } public function getUser() { return $this->user; } } class FactoryMan implements createUser { function create($properties) { return new userFactory($properties); } } class FactoryWoman implements createUser { function create($properties) { return new userFactory($properties); } } class clientUser { static public function getClient($properties) { $fac = new FactoryMan; $man = $fac->create($properties); echo $man->getUser()->getUsername(); } } $employers = [ ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'], ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'], ]; $user = clientUser::getClient($employers[0]); ?>

抽象工廠模式,供給一個創建一系列相關或者相互依附的對象的接口?梢岳斫獬,用來生產不用類型的整個產品,但是不能增加新品,支持增加新的類型。

<?php /** * 抽象工廠模式 * */ interface userProperties { function getUsername(); function getGender(); function getJob(); } interface createUser { //將對象的創建抽象成一個接口 function createOpen($properties);//內向創建 function createIntro($properties);//外向創建 } class User implements userProperties{ private $username; private $gender; private $job; public function __construct($username, $gender, $job) { $this->username = $username; $this->gender = $gender; $this->job = $job; } public function getUsername() { return $this->username; } public function getGender() { return $this->gender; } public function getJob() { return $this->job; } } class userFactory { private $user; public function __construct($properties = []) { $this->user = new User($properties['username'], $properties['gender'], $properties['job']); } public function getUser() { return $this->user; } } class FactoryMan implements createUser { function createOpen($properties) { return new userFactory($properties); } function createIntro($properties) { return new userFactory($properties); } } class FactoryWoman implements createUser { function createOpen($properties) { return new userFactory($properties); } function createIntro($properties) { return new userFactory($properties); } } class clientUser { static public function getClient($properties) { $fac = new FactoryMan; $man = $fac->createOpen($properties); echo $man->getUser()->getUsername(); } } $employers = [ ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'], ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'], ]; $user = clientUser::getClient($employers[0]); ?>

如有差錯,請指正。


評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)

站點導航

您可能在找這些
四川快乐12电视软件 十一运夺金图 股票权重什么意思 推麻将二八杠需要做多少张牌 刮刮乐ppt怎么做 王中王精选三肖中特 湖北30选5牛彩 比较靠谱的赚零钱软件 北京11选5投注网站 韩国快乐8|计划 浙江11选五遗漏值