PHP設(shè)計(jì)模式之工廠模式詳解
在開發(fā)大型系統(tǒng)時(shí),往往會(huì)出現(xiàn)這樣一種情況:
我有一部分基礎(chǔ)數(shù)據(jù),是類classA是從數(shù)據(jù)庫A讀取出來的,其他很多的功能都是基于這個(gè)基礎(chǔ)數(shù)據(jù)來操作的?,F(xiàn)在呢,我想把數(shù)據(jù)從數(shù)據(jù)庫A變成從另外的數(shù)據(jù)源去獲取,這時(shí)候,要修改起來就比較麻煩,要修改其他很多類的代碼。這種設(shè)計(jì)顯然是不夠靈活的,換句話說,就是緊耦合的,那么什么是緊耦合呢?緊耦合就是指系統(tǒng)中某個(gè)部分的函數(shù)或類嚴(yán)重依賴于系統(tǒng)的其他部分中的函數(shù)或類的行為和結(jié)構(gòu)。
這時(shí),工廠模式的作用性就體現(xiàn)出來了。
工廠模式
就是解決這樣的一些情況的設(shè)計(jì)方法。
工廠模式是一種類,建立了一個(gè)工廠來根據(jù)所需來創(chuàng)建對象,這種方式在多態(tài)性編程中是很重要的,允許動(dòng)態(tài)替換類,修改配置等。
/*基本工廠模式代碼*/
<?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(); ?>
工廠模式分為:簡單工廠模式、工廠方法模式、抽象工廠模式。
簡單工廠模式,通過靜態(tài)方法創(chuàng)建對象。可以理解成,只負(fù)責(zé)生產(chǎn)同一等級結(jié)構(gòu)中的任何一個(gè)產(chǎn)品,但是不能新增產(chǎn)品。
<?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(); ?>
工廠方法模式,去掉了簡單工廠模式中方法的靜態(tài)屬性,使其可以被子類集成,定義一個(gè)創(chuàng)建對象的接口,讓子類去決定實(shí)例化哪個(gè)類??梢岳斫獬?,用來生產(chǎn)同一等級結(jié)構(gòu)中的固定產(chǎn)品,但是支持增加產(chǎn)品。
<?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]); ?>
抽象工廠模式,提供一個(gè)創(chuàng)建一系列相關(guān)或者相互依賴的對象的接口。可以理解成,用來生產(chǎn)不用類型的全部產(chǎn)品,但是不能增加新品,支持增加新的類型。
<?php /** * 抽象工廠模式 * */ interface userProperties { function getUsername(); function getGender(); function getJob(); } interface createUser { //將對象的創(chuàng)建抽象成一個(gè)接口 function createOpen($properties);//內(nèi)向創(chuàng)建 function createIntro($properties);//外向創(chuàng)建 } 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]); ?>
如有錯(cuò)誤,請指正。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
php中call_user_func函數(shù)使用注意事項(xiàng)
這篇文章主要介紹了php中call_user_func函數(shù)使用注意事項(xiàng),較為詳細(xì)的講述了call_user_func函數(shù)的用法實(shí)例與注意事項(xiàng),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-11php使用Jpgraph創(chuàng)建3D餅形圖效果示例
這篇文章主要介紹了php使用Jpgraph創(chuàng)建3D餅形圖效果,結(jié)合實(shí)例形式分析了php基于Jpgraph繪制圖形的原理、實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-02-02php str_getcsv把字符串解析為數(shù)組的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猵hp str_getcsv把字符串解析為數(shù)組的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04PHP array_multisort() 函數(shù)的深入解析
本篇文章是對PHP中的array_multisort()函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php命令行(cli)模式下報(bào)require 加載路徑錯(cuò)誤的解決方法
本文給大家解決的是在php的cli模式下做任務(wù)計(jì)劃的php腳本總是執(zhí)行不成功,報(bào)“require 加載路徑錯(cuò)誤”,后來經(jīng)過一番研究,才找到問題所在,這里分享給大家。2015-11-11PHP實(shí)現(xiàn)導(dǎo)出帶樣式的Excel
有時(shí)客戶會(huì)向你抱怨,軟件為他們導(dǎo)出的Excel格式太難看了,或許這篇文章會(huì)對你有所幫助。在用PHP導(dǎo)出數(shù)據(jù)的同時(shí)還可以設(shè)置顏色、字號大小、加粗、合并單元格等等。2016-08-08ThinkPHP6使用最新版本Endroid/QrCode生成二維碼的方法實(shí)例
這篇文章主要介紹了ThinkPHP6使用最新版本Endroid/QrCode生成二維碼的方法,結(jié)合實(shí)例形式詳細(xì)分析了ThinkPHP6使用最新版本Endroid/QrCode生成二維碼具體步驟、原理、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2023-07-07