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