php 工厂模式 使用场景,PHP设计模式之工厂模式
序言
每一種模式都有它的定義,它的使用場(chǎng)景。我們從實(shí)際當(dāng)中進(jìn)行學(xué)習(xí)并且在相應(yīng)額場(chǎng)景可以運(yùn)用。所謂的設(shè)計(jì)模式只是一種思想,并不存在是有固定的代碼。學(xué)會(huì)了思想并且對(duì)應(yīng)上使用的場(chǎng)景,慢慢而言在開(kāi)發(fā)之中這也就慢慢成為你的一部分。
今天我們來(lái)講的是工廠模式,工廠模式一共分3三種。簡(jiǎn)單工廠模式,工廠方法模式以及抽象工廠模式。
簡(jiǎn)單工廠模式
在簡(jiǎn)單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類(lèi)的實(shí)例。簡(jiǎn)單工廠模式專(zhuān)門(mén)定義一個(gè)類(lèi)來(lái)負(fù)責(zé)創(chuàng)建其他類(lèi)的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類(lèi)。
用一種很通俗的話來(lái)說(shuō)就是,當(dāng)一位買(mǎi)家向玩具工廠訂貨,正好工廠有生產(chǎn)洋娃娃車(chē)間,布袋熊車(chē)間,湯姆貓車(chē)間等等。買(mǎi)家說(shuō)我需要洋娃娃,而工廠的終端與買(mǎi)家達(dá)成協(xié)議,并下達(dá)命令通知對(duì)應(yīng)的車(chē)間進(jìn)行生產(chǎn)。
具體我們使用php來(lái)模擬簡(jiǎn)單工廠模式,它有那一些構(gòu)造呢。
如:
Factory類(lèi):負(fù)責(zé)創(chuàng)建具體產(chǎn)品的實(shí)例
Product類(lèi):抽象產(chǎn)品類(lèi),定義產(chǎn)品子類(lèi)的公共接口
ConcreteProduct 類(lèi):具體產(chǎn)品類(lèi),實(shí)現(xiàn)Product父類(lèi)的接口功能,也可添加自定義的功能
Factory類(lèi),只負(fù)責(zé)下發(fā)對(duì)應(yīng)命令并且拿到相對(duì)應(yīng)的產(chǎn)品。
require_once 'dolly.php';
require_once 'tomcat.php';
require_once 'wombat.php';?
/** * Class factory */
class SimpleFactory{
/**
* 通知生產(chǎn)車(chē)間
* @param string $name 實(shí)際終端下的命令
* @return Dolly|Tomcat|Wombat
* @throws Exception
*/
public static function noticeWorkShop($name){
switch ($name) {
// 洋娃娃
case 'dolly':
return new Dolly();?
// 湯姆貓
case 'tom_cat':
return new Tomcat();?
// 布袋熊
case 'wombat':
return new Wombat();?
default:
throw new Exception('抱歉!我們工廠不生產(chǎn)該種類(lèi)玩具。');
}
}
}
?try {
$product = SimpleFactory::noticeWorkShop('dolly');
echo $product->sound();
} catch (Exception $e) {
echo $e->getMessage();
}
復(fù)制代碼
product接口類(lèi)定義產(chǎn)品對(duì)應(yīng)所擁有的行為
??interface Product {
/**
* @return mixed
*/
public function sound();
}
復(fù)制代碼
ConcreteProduct對(duì)應(yīng)的產(chǎn)品行為
require_once 'product.php';
?class Dolly implements Product {
?
/** * Dolly constructor. */
public function __construct() {
}
?
/** * @return mixed */
public function sound() {
echo '我叫洋娃娃';
}
}
復(fù)制代碼
總結(jié)簡(jiǎn)單工廠模式:
具體使用場(chǎng)景可以使用在
1. 不需要實(shí)例化過(guò)多的對(duì)象,盡可能保證代碼的簡(jiǎn)單。
2. 不需要關(guān)注對(duì)象是如何生成的操作。
從簡(jiǎn)單的工廠模式來(lái)看,首先由于只有一個(gè)工廠類(lèi),但是其最大的缺點(diǎn)在于工廠類(lèi)不夠靈活,增加新的具體產(chǎn)品需要修改工廠類(lèi)的判斷邏輯代碼,而且產(chǎn)品較多時(shí),工廠方法代碼將會(huì)非常復(fù)雜。
工廠方法
工廠方法模式是簡(jiǎn)單工廠的升級(jí)版,在原有的基礎(chǔ)上對(duì)工廠進(jìn)行一個(gè)抽象的升級(jí),我們不再提供一個(gè)統(tǒng)一的工廠類(lèi)來(lái)創(chuàng)建所有的對(duì)象,而是針對(duì)不同的對(duì)象提供不同的工廠。也就是說(shuō)每個(gè)對(duì)象都有一個(gè)與之對(duì)應(yīng)的工廠。
用一種很通俗的話來(lái)說(shuō)就是,當(dāng)一位買(mǎi)家向玩具工廠訂貨,原來(lái)在簡(jiǎn)單工廠里是使用的車(chē)間,后來(lái)進(jìn)行了升級(jí)變成子工廠,由終端下發(fā)到對(duì)應(yīng)的子廠商進(jìn)行生產(chǎn)。
具體我們使用php來(lái)模擬簡(jiǎn)單工廠模式,它有那一些構(gòu)造呢。在原有的基礎(chǔ)上多了一個(gè)工廠的抽象類(lèi)
如:
Factory類(lèi):負(fù)責(zé)創(chuàng)建具體產(chǎn)品的實(shí)例
Product類(lèi):抽象產(chǎn)品類(lèi),定義產(chǎn)品子類(lèi)的公共接口
ConcreteProduct 類(lèi):具體產(chǎn)品類(lèi),實(shí)現(xiàn)Product父類(lèi)的接口功能,也可添加自定義的功能
AbstractFactory類(lèi): 抽象工廠類(lèi),專(zhuān)門(mén)負(fù)責(zé)子廠商的生成
require_once 'dolly.php';
?
/** * Class AbstractFactory */
abstract class AbstractFactory {
/** * @return mixed */
abstract public static function create();
}
?
/** * Class DollyFactory */
class DollyFactory extends AbstractFactory {
/** * @return mixed */
public static function create() {
return new Dolly();
}
}
?$dolly = DollyFactory::create();
?$dolly->sound();
復(fù)制代碼
總結(jié)工廠方法模式:
具體使用場(chǎng)景可以使用在
1. 通過(guò)子類(lèi)來(lái)指定創(chuàng)建對(duì)應(yīng)的對(duì)象。
工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。由于使用了面向?qū)ο蟮亩鄳B(tài)性,工廠方法模式保持了簡(jiǎn)單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)。在工廠方法模式中,核心的工廠類(lèi)不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類(lèi)去做。這個(gè)核心類(lèi)僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不負(fù)責(zé)產(chǎn)品類(lèi)被實(shí)例化這種細(xì)節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。
抽象工廠方法
提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)須指定它們具體的類(lèi)。
此模式是對(duì)工廠方法模式的進(jìn)一步擴(kuò)展。在工廠方法模式中,一個(gè)具體的工廠負(fù)責(zé)生產(chǎn)一類(lèi)具體的產(chǎn)品,即一對(duì)一的關(guān)系,但是,如果需要一個(gè)具體的工廠生產(chǎn)多種產(chǎn)品對(duì)象,那么就需要用到抽象工廠模式了。
通俗而言,工廠將生產(chǎn)電視和生產(chǎn)手機(jī)合并成一個(gè)工廠,而中間不同產(chǎn)品的類(lèi)型成為1個(gè)工廠對(duì)應(yīng)多個(gè)不同的產(chǎn)品。
/** * Interface MiPhone */
interface MiPhone {
/** * @return mixed */
public function display();
?
/** * @return mixed */
public function use();
}
?
/** * Class Mi */
class Mi implements MiPhone {
/** * @return mixed */
public function display() {
echo "顯示屏幕內(nèi)容";
}
?
/** * @return mixed */
public function use() {
echo "正常操作內(nèi)容";
}
}
?
/** * Interface Tv */
interface Tv {
/** * @return mixed */
public function open();
?
/** * @return mixed */
public function use();
}
?
/** * Class MiTv */
class MiTv implements Tv {
/** * @return mixed */
public function open() {
echo "小米電視";
}
?
/** * @return mixed */
public function use() {
echo "切換不同的頻道";
}
}
?abstract class Factory {
/** * @return mixed */
abstract public static function createPhone();
?
/** * @return mixed */
abstract public static function createTv();
}
?
/** * Class ProductFactory */
class ProductFactory extends Factory {
public static function createTV() {
return new MiTv();
}
? public static function createPhone() {
return new Mi();
}
}
?$newTv = ProductFactory::createTV();
$newTv->open();
$newTv->use();
?$newPc = ProductFactory::createPhone();
$newPc->open();
$newPc->use();
復(fù)制代碼
總結(jié)抽象工廠方法模式:
具體使用場(chǎng)景可以使用在
1. 不需要知道它所創(chuàng)建的對(duì)象的類(lèi)
2. 需要一組對(duì)象共同完成某種功能時(shí)。并且可能存在多組對(duì)象完成不同功能的情況。
如果您對(duì)這些感興趣,歡迎評(píng)論,收藏、轉(zhuǎn)發(fā)給予支持!> 歡迎關(guān)注我的公眾號(hào):猿力說(shuō),每日分享學(xué)習(xí)之路的點(diǎn)點(diǎn)滴滴,以及程序人生.
總結(jié)
以上是生活随笔為你收集整理的php 工厂模式 使用场景,PHP设计模式之工厂模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java获取mavenlib路径,mav
- 下一篇: php 正则表达式 后向引用,php正则