欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

實(shí)例講解PHP設(shè)計(jì)模式編程中的簡(jiǎn)單工廠模式

 更新時(shí)間:2016年02月29日 09:39:23   作者:常思過(guò)  
這篇文章主要介紹了PHP設(shè)計(jì)模式編程中的簡(jiǎn)單工廠模式,舉了一個(gè)水果銷售和一個(gè)計(jì)算器設(shè)計(jì)的例子,需要的朋友可以參考下

簡(jiǎn)單工廠模式是類的創(chuàng)建模式,又叫做靜態(tài)工廠方法(Static Factory Method)模式。簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象決定創(chuàng)建出那一種產(chǎn)品類的實(shí)例。

1.工廠模式的幾種形態(tài)
工廠模式專門負(fù)責(zé)將大量有共同接口的類實(shí)例化。工廠模式可以動(dòng)態(tài)決定將哪一個(gè)類實(shí)例化,不必事先知道每次要實(shí)例化哪一個(gè)類。工廠模式有以下幾種形態(tài):
(1)簡(jiǎn)單工廠(Simple Factory)模式,又稱靜態(tài)工廠方法模式(Static Factory Method Pattern)。
(2)工廠方法(Factory Method)模式,又稱多態(tài)性工廠(Polymorphic Factory)模式或虛擬構(gòu)造子(Virtual Constructor)模式;
(3)抽象工廠(Abstract Factory)模式,又稱工具箱(Kit 或Toolkit)模式。下面就是簡(jiǎn)單工廠模式的簡(jiǎn)略類圖。

簡(jiǎn)單工廠模式,或稱靜態(tài)工廠方法模式,是不同的工廠方法模式的一個(gè)特殊實(shí)現(xiàn)。在其他文獻(xiàn)中,簡(jiǎn)單工廠往往作為普通工廠模式的一個(gè)特例討論。
學(xué)習(xí)簡(jiǎn)單工廠模式是對(duì)學(xué)習(xí)工廠方法模式的一個(gè)很好的準(zhǔn)備,也是對(duì)學(xué)習(xí)其他模式,特別是單例模式和多例模式的一個(gè)很好的準(zhǔn)備。

2 .簡(jiǎn)單工廠模式的引進(jìn)

比如說(shuō)有一個(gè)農(nóng)場(chǎng)公司,專門向市場(chǎng)銷售各類水果。在這個(gè)系統(tǒng)里需要描述下列的水果:
葡萄 Grape
草莓 Strawberry
蘋果 Apple
水果與其他的植物有很大的不同,就是水果最終是可以采摘食用的。那么一個(gè)自然的作法就是建立一個(gè)各種水果都適用的接口,以便與農(nóng)場(chǎng)里的其他植物區(qū)分開(kāi)。如下圖所示。

水果接口規(guī)定出所有的水果必須實(shí)現(xiàn)的接口,包括任何水果類必須具備的方法:種植plant(),生長(zhǎng)grow()以及收獲harvest()。接口Fruit 的類圖如下所示。

這個(gè)水果接口的源代碼如下所示。
代碼清單1:接口Fruit 的源代碼

interface Fruit
{
public function grow();
public function harvest();
public function plant();
}

Apple 類是水果類的一種,因此它實(shí)現(xiàn)了水果接口所聲明的所有方法。另外,由于蘋果是多年生植物,因此多出一個(gè)treeAge 性質(zhì),描述蘋果樹(shù)的樹(shù)齡。下面是這個(gè)蘋果類的源代碼。
代碼清單2:類Apple 的源代碼

class Apple implements Fruit
{
private $_treeAge;
public function grow()
{
echo "Apple is growing.";
}
public function harvest()
{
echo "Apple has been harvested.";
}
public function plant()
{
echo "Apple has been planted.";
}
public function getTreeAge()
{
return $this->_treeAge;
}
public function setTreeAge($treeAge)
{
$this->_treeAge = (int) $treeAge;
}
}

同樣,Grape 類是水果類的一種,也實(shí)現(xiàn)了Fruit 接口所聲明的所有的方法。但由于葡萄分有籽和無(wú)籽兩種,因此,比通常的水果多出一個(gè)seedless 性質(zhì),如下圖所示。

葡萄類的源代碼如下所示??梢钥闯?,Grape 類同樣實(shí)現(xiàn)了水果接口,從而是水果類型的一種子類型。
代碼清單3:類Grape 的源代碼

class Grape implements Fruit
{
private $seedless;
public function grow()
{
echo "Grape is growing.";
}
public function harvest()
{
echo "Grape has been harvested.";
}
public function plant()
{
echo "Grape has been planted.";
}
public function getSeedless()
{
return $this->seedless;
}
public function setSeedless($seedless)
{
$this->seedless = (boolean) $seedless;
}
}

Strawberry 類實(shí)現(xiàn)了Fruit 接口,因此,也是水果類型的子類型,其源代碼如下所示。
代碼清單4:類Strawberry 的源代碼

class Strawberry implements Fruit
{
public function grow()
{
echo "Strawberry is growing.";
}
public function harvest()
{
echo "Strawberry has been harvested.";
}
public function plant()
{
echo "Strawberry has been planted.";
}
}

農(nóng)場(chǎng)的園丁也是系統(tǒng)的一部分,自然要由一個(gè)合適的類來(lái)代表。這個(gè)類就是FruitGardener 類,其結(jié)構(gòu)由下面的類圖描述。

FruitGardener 類會(huì)根據(jù)客戶端的要求,創(chuàng)建出不同的水果對(duì)象,比如蘋果(Apple),葡萄(Grape)或草莓(Strawberry)的實(shí)例。而如果接到不合法的要求,F(xiàn)ruitGardener 類會(huì)拋出BadFruitException 異常。
園丁類的源代碼如下所示。
代碼清單5:FruitGardener 類的源代碼

class FruitGardener
{
public static function factory($which)
{
$which = strtolower($which);
if ($which == 'apple') {
return new Apple();
} elseif ($which == 'strawberry') {
return new Strawberry();
} elseif ($which == 'grape') {
return new Grape();
} else {
throw new BadFruitException('Bad fruit request');
}
}
}

可以看出,園丁類提供了一個(gè)靜態(tài)工廠方法。在客戶端的調(diào)用下,這個(gè)方法創(chuàng)建客戶端所需要的水果對(duì)象。如果客戶端的請(qǐng)求是系統(tǒng)所不支持的,工廠方法就會(huì)拋出一個(gè)BadFruitException 異常。這個(gè)異常類的源代碼如下所示。
代碼清單6:BadFruitException 類的源代碼

class BadFruitException extends Exception
{
}

在使用時(shí),客戶端只需調(diào)用FruitGardener 的靜態(tài)方法factory()即可。請(qǐng)見(jiàn)下面的示意
性客戶端源代碼。
代碼清單7:怎樣使用異常類BadFruitException

try {
FruitGardener::factory('apple');
FruitGardener::factory('grape');
FruitGardener::factory('strawberry');
//...
} catch (BadFruitException $e) {
//...
}

這樣,農(nóng)場(chǎng)一定會(huì)百果豐收啦!

3.使用簡(jiǎn)單工廠模式設(shè)計(jì)一個(gè)“面向?qū)ο蟮摹庇?jì)算器

/**
 * 面向?qū)ο笥?jì)算器
 * 思路:
 * 1、面向?qū)ο蟮幕荆庋b、繼承、多太
 * 2、父類公用類
 * 3、各種運(yùn)算類
 */
 
/**
 * 基類,運(yùn)算類
 * 只提供基本數(shù)據(jù),不參與運(yùn)算
 */
 
class Operation {
  
 // 第一個(gè)數(shù)
 public $first_num = 0;
  
 // 第二個(gè)數(shù)
 public $second_num = 0;
  
 /**
  * 獲取結(jié)果,其他類覆蓋此方法
  * @return double $result
  */
 public function getResult() {
  $result = 0.00;
   
  return $result;
 }
}
 
/**
 * 加法類
 */
class OperationAdd extends Operation {
 /**
  * 覆蓋父類,實(shí)現(xiàn)加法算法
  */
 public function getResult() {
  $result = 0;
  return $this->first_num + $this->second_num;
 }
}
 
/**
 * 減法類
 *
 */
class OperationSub extends Operation {
 /**
  * 覆蓋父類,實(shí)現(xiàn)加法算法
  */
 public function getResult() {
  $result = 0;
  return $this->first_num - $this->second_num;
 }
}
 
/**
 * 乘法類
 *
 */
class OperationMul extends Operation {
 /**
  * 覆蓋父類,實(shí)現(xiàn)加法算法
  */
 public function getResult() {
  $result = 0;
  return $this->first_num * $this->second_num;
 }
}
 
/**
 * 除類
 *
 */
class OperationDiv extends Operation {
 /**
  * 覆蓋父類,實(shí)現(xiàn)加法算法
  */
 public function getResult() {
  $result = 0;
   
  if ($this->second_num == 0) {
   throw new Exception('除法操作第二個(gè)參數(shù)不能為零!');
   return 0;
  }
   
  return $this->first_num / $this->second_num;
 }
}
 
/**
 * 工廠類
 */
class OperationFactory {
 /**
  * 工廠函數(shù)
  * @param string $operation
  * @return object
  */
 public function createOperation($operation) {
  $oper = null;
   
  switch($operation) {
   case '+':
    $oper = new OperationAdd();
    break;
   case '-':
    $oper = new OperationSub();
    break;
   case '*':
    $oper = new OperationMul();
    break;
   case '/':
    $oper = new OperationDiv();
    break;
   default:
    return 0;
  }
  return $oper;
 }
}
 
 
$operation = new OperationFactory();
$oper = $operation->createOperation('/');
 
$oper->first_num = 10;
$oper->second_num = 20;
var_dump($oper->getResult());

201622993823532.jpg (780×328)

相關(guān)文章

  • ThinkPHP3.2.1圖片驗(yàn)證碼實(shí)現(xiàn)方法

    ThinkPHP3.2.1圖片驗(yàn)證碼實(shí)現(xiàn)方法

    這篇文章主要介紹了ThinkPHP3.2.1圖片驗(yàn)證碼實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了thinkPHP3.2.1生成圖片驗(yàn)證碼過(guò)程中遇到的問(wèn)題及相應(yīng)的解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • 一次因composer錯(cuò)誤使用引發(fā)的問(wèn)題與解決

    一次因composer錯(cuò)誤使用引發(fā)的問(wèn)題與解決

    這篇文章主要給大家介紹了一次因composer錯(cuò)誤使用引發(fā)的問(wèn)題與解決方法,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • PHP 輸出URL的快捷方式示例代碼

    PHP 輸出URL的快捷方式示例代碼

    輸出URL的快捷方式的實(shí)現(xiàn)方法有很多,在本文將為大家介紹下使用php是如何實(shí)現(xiàn)的,感興趣的朋友可以參考下,希望對(duì)大家有所幫助
    2013-09-09
  • Yii2簡(jiǎn)單實(shí)現(xiàn)多語(yǔ)言配置的方法

    Yii2簡(jiǎn)單實(shí)現(xiàn)多語(yǔ)言配置的方法

    這篇文章主要介紹了Yii2簡(jiǎn)單實(shí)現(xiàn)多語(yǔ)言配置的方法,涉及Yii配置文件的設(shè)置及語(yǔ)言包的操作方法,需要的朋友可以參考下
    2016-07-07
  • Laravel框架集合用法實(shí)例淺析

    Laravel框架集合用法實(shí)例淺析

    這篇文章主要介紹了Laravel框架集合用法,結(jié)合實(shí)例形式簡(jiǎn)單分析了Laravel框架集合的基本原理、創(chuàng)建與使用方法,需要的朋友可以參考下
    2020-05-05
  • 基于PHP的簡(jiǎn)單采集數(shù)據(jù)入庫(kù)程序

    基于PHP的簡(jiǎn)單采集數(shù)據(jù)入庫(kù)程序

    前幾天有一朋友要我?guī)妥鲆粋€(gè)采集新聞信息的程序,抽了點(diǎn)時(shí)間寫了個(gè)PHP版本的,隨筆記錄下。
    2014-07-07
  • 如何使用php生成zip壓縮包

    如何使用php生成zip壓縮包

    這篇文章主要介紹了如何使用php生成zip壓縮包,對(duì)壓縮感興趣的同學(xué),可以實(shí)驗(yàn)一下
    2021-04-04
  • php防止網(wǎng)站被攻擊的應(yīng)急代碼

    php防止網(wǎng)站被攻擊的應(yīng)急代碼

    這篇文章為大家提供了php防止網(wǎng)站被攻擊的應(yīng)急代碼,這是一個(gè)辦法,絕對(duì)不是最好的解決方式,只是想提供給大家,大家一起探討探討。
    2015-10-10
  • CodeIgniter記錄錯(cuò)誤日志的方法全面總結(jié)

    CodeIgniter記錄錯(cuò)誤日志的方法全面總結(jié)

    這篇文章主要介紹了CodeIgniter記錄錯(cuò)誤日志的方法,詳細(xì)分析了CodeIgniter框架的文件結(jié)構(gòu)與相應(yīng)的功能,結(jié)合實(shí)例分析了CodeIgniter框架記錄錯(cuò)誤日志的實(shí)現(xiàn)技巧,并分析了隱藏index文件與數(shù)據(jù)傳輸?shù)燃记?總結(jié)非常全面,需要的朋友可以參考下
    2016-05-05
  • PHP中創(chuàng)建和編輯Excel表格的方法

    PHP中創(chuàng)建和編輯Excel表格的方法

    本文通過(guò)實(shí)例代碼給大家介紹了如何在php中使用PHPExcel庫(kù)實(shí)現(xiàn)創(chuàng)建和編輯Excel表格的方法,希望大家能夠喜歡
    2018-09-09

最新評(píng)論