亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP設計模式之工廠模式定義與用法詳解

2024-05-05 00:03:04
字體:
來源:轉載
供稿:網友

本文實例講述了PHP設計模式之工廠模式定義與用法。分享給大家供大家參考,具體如下:

工廠模式(Factory Design Pattern)作為一種創建型設計模式, 遵循了開放-封閉原則, 對修改封閉, 對擴展開放. 工廠方法(Factory Method)模式就是要創建"某種東西". 對于工廠方法模式, 要創建的"東西"是一個產品,這個產品與創建它的類之間不存在綁定.實際上,為了保持這種松耦合,客戶會通過一個工廠發出請求. 再由工廠創建所請求的產品.也可以換種方式考慮, 利用工廠方法模式, 請求者只發出請求, 而不具體創建產品.

工廠的工作

先建立一個工廠的接口

Factory.php

<?phpabstract class Factory{ //抽象的創建對象的方法 protected abstract function createProduct(); //該方法調用createProduct方法返回一個產品對象. public function start() {   return $this->createProduct(); }}

start方法返回一個產品,該方法調用createProduct方法完成產生產品的操作.所以createProduct的具體實現要構建并返回一個按Product接口實現的產品對象.

比如產品都有一個共同的方法getProperties(), 以下是對應Product接口

Product.php

<?php//產品接口interface Product{ public function getProperties();}

接著, 我們要建立兩個工廠,文本工廠TextFactory和圖像工廠phptoFactory

TextFactory.php

<?phpinclude_once('Factory.php');include_once('TextProduct.php');class TextFactory extends Factory{ protected function createProduct() {  $product = new TextProduct();  return $product->getProperties(); }}

PhotoFactory.php

<?phpinclude_once('Factory.php');include_once('PhotoProduct.php');class PhotoFactory extends Factory{ protected function createProduct() {  $product = new PhotoProduct();  return $product->getProperties(); }}

可以看到,在工廠方法的實現中, getProperties方法引入了多態(polymorphism), 將用這個方法返回"文本"或"圖像". 同一個getProperties()有多個(poly)不同的形態(morphs), 這就是多態.在這種情況下, 其中一種形式返回文本, 而另一種返回圖像.

可以在properties這個實現中放入你想要的任何東西,工廠方法設計將會創建這個對象, 并把他返回給Client使用.

下面的是兩個產品的實現

TextProduct.php

<?phpinclude_once('Product.php');class TextProduct implements Product{ public function getProperties() {  return "這里是文本產品"; }}

PhotoProduct.php

<?phpinclude_once('Product.php');class PhotoProduct implements Product{ //這是產品具有的方法 public function getProperties() {  return "這里是圖像產品"; }}

這兩個產品實現了Product接口中的抽象方法getProperties(),

客戶(Client)

我們并不希望客戶直接做出產品請求.實際上, 我們希望客戶通過Factory工廠接口做出請求.這樣一來,如果以后我們增加了產品或者工廠, 客戶可以做同樣的請求來得到更多類型的產品 , 而不會破壞這個應用:

Client.php

<?phpinclude_once('PhotoFactory.php');include_once('TextFactory.php');class Client{ public function __construct() {  $this->somePhotoObject = new PhotoFactory();  echo $this->somePhotoObject->start() . '<br />';  $this->someTextObject = new TextFactory();  echo $this->someTextObject->start() . '<br />'; }}$worker = new Client();

運行Client.php, 得到下面的結果

這里是圖像產品
這里是文本產品

注意: Client對象并沒有向產品直接做出請求, 而是通過工廠來請求. 重要的是, 客戶并不實現產品特性, 而留給產品實現來體現.

調整產品

設計模式的真正價值并不是提高操作的速度, 而是加快開發的速度.

如果現在需求變化了, 需要對圖像產品做出修改, 只需要修改相應的產品PhotoProduct的getProperties方法即可

對象的改變看起來很簡單 不過Product的getProperties()方法仍保持相同的接口,請求工廠返回一個屬性對象

增加新產品和參數化請求

問題來了,如果要增加更多的圖像和文本說明, 有沒有必要每次增加一個新的區域就增加一個新的具體的工廠類?這意味著要為每個新區域增加一個新工廠和產品.于是,我們引進了參數化工廠設計模式

參數化工廠設計模式和一般的工廠設計模式的主要區別之一是客戶包含工廠和產品的引用. 在參數化請求中, Client類必須指定產品, 而不是產品工廠. createProduct()操作中的參數是由客戶傳入一個產品; 所以客戶必須指出它想要的具體產品. 不過, 這個請求仍然是通過工廠接口Factory發出的. 所以, 盡管客戶包含一個產品引用, 但通過Factory, 客戶仍然與產品分離.

一個工廠多個產品(參數化工廠方法)

對于大多數請求, 參數化工廠方法更為簡單, 因為客戶只需要處理一個具體工廠.工廠方法操作有一個參數,指示需要創建的產品.而在原來的設計中, 每個產品都有自己的工廠, 不需要另個傳遞參數; 產品實現依賴于各個產品特定的工廠.

新工廠接口

Factory.php

<?phpabstract class Factory{ //抽象的創建對象的方法 protected abstract function createProduct(Product $product); //該方法由factoryMethod方法返回一個產品對象. public function start($product) {   return $this->createProduct($product); }}

在這個新的Factory接口中可以看到, create()start()都需要一個參數,指定一個Product對象, 而不是Product接口的一個特定實現, 所以可以接受任何Product的具體實例.

工廠具體實現

具體的創建者類CommonFactory實現了createProduct(),如下

CommonFactory.php

<?phpinclude_once('Factory.php');include_once('Product.php');class CommonFactory extends Factory{ protected function createProduct(Product $product) {  return $product->getProperties(); }}

這個類調用Product的方法getProperties將產品返回給客戶.

新產品

具體產品的變化并不會改變原來的Product接口,還是原來的代碼

<?php//產品接口interface Product{ public function getProperties();}

例如, 現在有一個鋼筆產品PenProduct

PenProduct.php

<?phpinclude_once('Product.php');class PenProduct implements Product{ public function getProperties() {  return "鋼筆產品"; }}

客戶Clent(有參數)

<?phpinclude_once('CommonFactory.php');include_once('PenProduct.php');class Client{ public function __construct() {  $commonFactory = new CommonFactory();  echo $commonFactory->start(new PenProduct()); }}$worker = new Client();

運行后輸出

鋼筆產品

以后如果開發出了新的產品, 只需要創建對應的產品類, 然后客戶指定想要的新產品 , 即可返回客戶需要的產品.

總結:

產品改變: 接口不變

使用設計模式的一大好處就是可以很容易地對類做出改變, 而不會破壞更大的程序. 之所以能夠容易地做出改變, 秘訣在于保持接口不變, 而只改變內容.

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人精品h版在线观看| 日韩欧中文字幕| 日韩国产精品亚洲а∨天堂免| 欧美日韩亚洲国产一区| 国产美女久久久| 国产亚洲人成a一在线v站| 亚洲天堂av在线免费观看| 亚洲国产婷婷香蕉久久久久久| 色综合色综合网色综合| 26uuu另类亚洲欧美日本一| 日韩在线视频观看正片免费网站| 日韩人体视频一二区| 国产精品xxx视频| 久久免费成人精品视频| 91日本在线视频| 日韩欧美亚洲一二三区| 奇门遁甲1982国语版免费观看高清| 4438全国亚洲精品在线观看视频| 国产精品91久久久| 日本高清视频精品| 热99精品里视频精品| 久久大大胆人体| 国产成人精品免费久久久久| 国产精品高潮粉嫩av| 亚洲二区在线播放视频| 欧美一级电影免费在线观看| 国产亚洲精品一区二555| 国产精品男女猛烈高潮激情| 91精品国产色综合| 国产一区二区三区毛片| 亚洲激情自拍图| 色哟哟网站入口亚洲精品| 日韩女优人人人人射在线视频| 欧美成人网在线| 久久精品免费电影| 国产精品久久久久不卡| 91国产美女在线观看| 国产精品9999| 日韩成人激情在线| 91探花福利精品国产自产在线| 伊人伊成久久人综合网站| 欧美亚洲日本黄色| 欧美高清理论片| 欧美日韩综合视频网址| 97久久国产精品| 久久国产精品免费视频| 日韩欧美中文第一页| 久久久久999| 欧美成人激情在线| 欧美猛男性生活免费| 亚洲成人亚洲激情| 黄网动漫久久久| 欧美性受xxxx黑人猛交| 影音先锋欧美精品| 中文字幕亚洲欧美在线| 黑人精品xxx一区| 97久久国产精品| 中文字幕少妇一区二区三区| www国产精品com| 国产欧美一区二区白浆黑人| 国产精品成人va在线观看| 亚洲男人的天堂在线| 日韩国产激情在线| 性欧美xxxx视频在线观看| 在线观看中文字幕亚洲| 日本免费久久高清视频| 国模吧一区二区三区| 91精品国产网站| 成年无码av片在线| 亚洲最大在线视频| 久久久天堂国产精品女人| 亚洲综合视频1区| 在线观看精品国产视频| 国产香蕉97碰碰久久人人| 国产精品日韩欧美| 热久久这里只有精品| 精品高清美女精品国产区| 人人做人人澡人人爽欧美| 精品久久久久久亚洲国产300| 日韩中文字幕网站| 国产精品久久久久久搜索| 日韩免费高清在线观看| 亚洲精选一区二区| 日韩av最新在线观看| 精品国产一区二区在线| 亚洲黄一区二区| 久久久久中文字幕2018| 国产精品久久在线观看| 欧美大片欧美激情性色a∨久久| 成人福利网站在线观看11| 欧美激情一区二区三区在线视频观看| 欧美午夜无遮挡| 欧美成人一二三| 国产精品视频导航| 欧美黑人巨大xxx极品| 亚州国产精品久久久| 欧美激情精品久久久久久黑人| 亚洲自拍av在线| 国产亚洲精品日韩| 亚洲aⅴ男人的天堂在线观看| 亚洲精品一区av在线播放| 国产精品久久9| 日韩视频免费大全中文字幕| 91国语精品自产拍在线观看性色| 日韩成人性视频| 日韩美女在线观看一区| 国产精品视频久久久| 国产乱人伦真实精品视频| 欧美激情视频网| 亚洲成人激情小说| 国产成人久久久精品一区| 2019国产精品自在线拍国产不卡| 亚洲综合精品伊人久久| 国产91免费看片| 欧美诱惑福利视频| 国产精品久久久久久久7电影| 日韩av色综合| 成人有码在线视频| 91精品国产综合久久香蕉922| 国产精品99久久久久久www| 日韩av不卡电影| 国产精品激情自拍| 亚洲三级黄色在线观看| 最新中文字幕亚洲| 一级做a爰片久久毛片美女图片| 精品久久久国产精品999| 国产一区二区丝袜高跟鞋图片| 57pao成人国产永久免费| 亚洲成在人线av| 欧美性猛交xxxx| 亚洲精品网址在线观看| 久久成人在线视频| 日韩av影院在线观看| 97免费在线视频| 欧美精品精品精品精品免费| 国产美女精品视频免费观看| 国产精品高潮呻吟久久av野狼| 91中文精品字幕在线视频| 亚洲最大在线视频| 色综久久综合桃花网| 欧美风情在线观看| 色综合伊人色综合网| 中文字幕亚洲无线码在线一区| 精品久久久久国产| 97国产一区二区精品久久呦| 久久久精品999| 国产亚洲精品91在线| 亚洲永久免费观看| 久久视频在线看| 日韩av中文字幕在线播放| 欧美视频裸体精品| 久久视频中文字幕| 日本精品久久中文字幕佐佐木| 伊人av综合网| 国产日韩欧美另类| 国内偷自视频区视频综合| 久久99国产精品久久久久久久久| 精品露脸国产偷人在视频| 欧美视频在线看| 2019中文字幕在线免费观看| 国产精品高精视频免费| 日本精品视频在线播放| 亚洲欧美中文字幕在线一区| 欧美激情精品久久久久久蜜臀|