首頁 >後端開發 >php教程 >PHP工廠模式使用案例及分析

PHP工廠模式使用案例及分析

php中世界最好的语言
php中世界最好的语言原創
2018-05-17 11:20:141384瀏覽

這次帶給大家PHP工廠模式使用案例及分析,PHP工廠模式使用案例及分析的注意事項有哪些,下面就是實戰案例,一起來看一下。

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

工廠的工作

先建立一個工廠的介面

Factory.php

#
<?php
abstract 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

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

PhotoFactory.php

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

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

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

下面的是兩個產品的實作

#TextProduct.php

<?php
include_once(&#39;Product.php&#39;);
class TextProduct implements Product
{
 public function getProperties()
 {
  return "这里是文本产品";
 }
}

PhotoProduct .php

<?php
include_once(&#39;Product.php&#39;);
class PhotoProduct implements Product
{
 //这是产品具有的方法
 public function getProperties()
 {
  return "这里是图像产品";
 }
}

這兩個產品實作了Product介面中的抽象方法getProperties(),

客戶(Client)

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

Client.php

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

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

這裡是圖像產品
這裡是文字產品

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

#調整產品

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

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

物件的改變看起來很簡單不過Product的

getProperties()方法仍保持相同的介面,請求工廠返回一個屬性物件

增加新產品和參數化請求

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

參數化工廠設計模式和一般的工廠設計模式的主要區別之一是客戶包含工廠和產品的引用. 在參數化請求中, Client類別必須指定產品, 而不是產品工廠.

createProduct()操作中的參數是由客戶傳入一個產品; 所以客戶必須指出它想要的具體產品. 不過, 這個請求仍然是透過工廠介面Factory發出的. 所以, 儘管客戶包含一個產品引用, 但透過Factory, 客戶仍然與產品分離.

一个工厂多个产品(参数化工厂方法)

对于大多数请求, 参数化工厂方法更为简单, 因为客户只需要处理一个具体工厂.工厂方法操作有一个参数,指示需要创建的产品.而在原来的设计中, 每个产品都有自己的工厂, 不需要另个传递参数; 产品实现依赖于各个产品特定的工厂.

新工厂接口

Factory.php

<?php
abstract 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

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

这个类调用Product的方法getProperties将产品返回给客户.

新产品

具体产品的变化并不会改变原来的Product接口,还是原来的代码

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

例如, 现在有一个钢笔产品PenProduct

PenProduct.php

<?php
include_once(&#39;Product.php&#39;);
class PenProduct implements Product
{
 public function getProperties()
 {
  return "钢笔产品";
 }
}

客户Clent(有参数)

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

运行后输出

钢笔产品

以后如果开发出了新的产品, 只需要创建对应的产品类, 然后客户指定想要的新产品 , 即可返回客户需要的产品.

总结:

产品改变: 接口不变

使用设计模式的一大好处就是可以很容易地对类做出改变, 而不会破坏更大的程序. 之所以能够容易地做出改变, 秘诀在于保持接口不变, 而只改变内容.

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

PHP单一职责原则(SRP)使用案例解析

PHP实现红包金额拆分算法案例详解

以上是PHP工廠模式使用案例及分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn