一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - PHP設(shè)計模式之工廠模式定義與用法詳解

PHP設(shè)計模式之工廠模式定義與用法詳解

2019-10-13 14:38雪山飛豬 PHP教程

這篇文章主要介紹了PHP設(shè)計模式之工廠模式,結(jié)合實例形式詳細分析了php工廠模式的概念、原理、定義、用法及相關(guān)操作注意事項,需要的朋友可以參考下

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

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

工廠的工作

先建立一個工廠的接口

Factory.php

<?php
abstract class Factory
{
 //抽象的創(chuàng)建對象的方法
 protected abstract function createProduct();
 //該方法調(diào)用createProduct方法返回一個產(chǎn)品對象.
 public function start()
 {
   return $this->createProduct();
 }
}

start方法返回一個產(chǎn)品,該方法調(diào)用createProduct方法完成產(chǎn)生產(chǎn)品的操作.所以createProduct的具體實現(xiàn)要構(gòu)建并返回一個按Product接口實現(xiàn)的產(chǎn)品對象.

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

Product.php

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

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

TextFactory.php

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

PhotoFactory.php

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

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

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

下面的是兩個產(chǎn)品的實現(xiàn)

TextProduct.php

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

PhotoProduct.php

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

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

客戶(Client)

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

Client.php

<?php
include_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, 得到下面的結(jié)果

這里是圖像產(chǎn)品
這里是文本產(chǎn)品

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

調(diào)整產(chǎn)品

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

如果現(xiàn)在需求變化了, 需要對圖像產(chǎn)品做出修改, 只需要修改相應(yīng)的產(chǎn)品PhotoProduct的getProperties方法即可

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

增加新產(chǎn)品和參數(shù)化請求

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

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

一個工廠多個產(chǎn)品(參數(shù)化工廠方法)

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

新工廠接口

Factory.php

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

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

工廠具體實現(xiàn)

具體的創(chuàng)建者類CommonFactory實現(xiàn)了createProduct(),如下

CommonFactory.php

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

這個類調(diào)用Product的方法getProperties將產(chǎn)品返回給客戶.

新產(chǎn)品

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

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

例如, 現(xiàn)在有一個鋼筆產(chǎn)品PenProduct

PenProduct.php

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

客戶Clent(有參數(shù))

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

運行后輸出

鋼筆產(chǎn)品

以后如果開發(fā)出了新的產(chǎn)品, 只需要創(chuàng)建對應(yīng)的產(chǎn)品類, 然后客戶指定想要的新產(chǎn)品 , 即可返回客戶需要的產(chǎn)品.

總結(jié):

產(chǎn)品改變: 接口不變

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品 色 | 免费看又黄又爽又猛的视频软件- | 国产在线看片网站 | 欧美亚洲视频在线观看 | 半挠脚心半黄的网站 | 肥胖女性大bbbbbb视频女厕 | 亚洲成人精品久久 | 美女禁18| 麻豆网 | 2022国产麻豆剧传媒古装 | 玩两个少妇女邻居 | 欧美肥乳| 久久久久久久99精品免费观看 | 女教师被女同学调教成脚奴 | 99久久国产综合精品女小说 | 成人区精品一区二区毛片不卡 | 亚洲欧美日韩特级毛片 | 二次元美女互摸隐私互扒 | 亚洲国产精品嫩草影院久久 | 日韩先锋| 美女露全身永久免费网站 | 性欧美sexvideo另类 | 国产伦精品一区二区三区女 | 99国内精品久久久久久久黑人 | 韩国美女激情vip | www.片| 91精品国产色综合久久不卡蜜 | 俺去俺来也www色官网免费的 | 四虎在线永久免费视频网站 | 我把校花黑色蕾丝胸罩脱了 | 欧美日韩国产精品自在自线 | 美女扒开腿让男人桶爽动态图片 | 免费lulu网站 | 日韩 国产 欧美 | 美女禁区视频无遮挡免费看 | 日韩欧美在线看 | 国色天香社区视频免费观看3 | 日本hdxxxx护士| 欧美日韩国产一区二区三区在线观看 | 国产一区二区在线免费观看 | 视频网站入口在线看 |