程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php設計模式 — 簡單工廠模式(靜態工廠方法模式),php設計模式

php設計模式 — 簡單工廠模式(靜態工廠方法模式),php設計模式

編輯:關於PHP編程

php設計模式 — 簡單工廠模式(靜態工廠方法模式),php設計模式


概念

簡單工廠模式 【靜態工廠方法模式】(Static Factory Method)
是類的創建模式

工廠模式的幾種形態:
  1、簡單工廠模式(Simple Factory) |又叫做  靜態工廠方法模式(Static Factory Method)
  2、工廠方法模式(Factory Method) |又叫做 多態性工廠模式(Polymorphic Factory)
  3、抽象工廠模式(Abstract Factory) |又叫做 工具箱模式(ToolKit)

配圖

代碼實例

直接將代碼運行即可,都是測試過的

  1 <?php
  2 
  3 /**
  4  * 一個事例
  5  *
  6  * 一個農場,要向市場銷售水果
  7  * 農場裡有三種水果 蘋果、葡萄
  8  * 我們設想:1、水果有多種屬性,每個屬性都有不同,但是,他們有共同的地方 |  生長、種植、收貨、吃
  9  *              2、將來有可能會增加新的水果、我們需要定義一個接口來規范他們必須實現的方法
 10  *              3、我們需要獲取某個水果的類,要從農場主那裡去獲取某個水果的實例,來知道如何生長、種植、收貨、吃
 11  */
 12 
 13 
 14 /**
 15  * 虛擬產品接口類
 16  * 定義好需要實現的方法
 17  */
 18 
 19 interface fruit{
 20 
 21     /**
 22      * 生長
 23      */
 24     public function grow();
 25 
 26     /**
 27      * 種植
 28      */
 29     public function plant();
 30 
 31     /**
 32      * 收獲
 33      */
 34     public function harvest();
 35 
 36     /**
 37      * 吃
 38      */
 39     public function eat();
 40     
 41 }
 42 
 43 
 44 /**
 45  * 定義具體產品類 蘋果
 46  * 首先,我們要實現所繼承的接口所定義的方法
 47  * 然後定義蘋果所特有的屬性,以及方法
 48  */
 49 class apple implements fruit{
 50 
 51     //蘋果樹有年齡
 52     private $treeAge;
 53 
 54     //蘋果有顏色
 55     private $color;
 56 
 57     public function grow(){
 58         echo "grape grow";
 59     }
 60 
 61     public function plant(){
 62         echo "grape plant";
 63     }
 64 
 65     public function harvest(){
 66         echo "grape harvest";
 67     }
 68 
 69     public function eat(){
 70         echo "grape eat";
 71     }
 72 
 73     //取蘋果樹的年齡
 74     public function getTreeAge(){
 75         return $this->treeAge;
 76     }
 77 
 78     //設置蘋果樹的年齡
 79     public function setTreeAge($age){
 80         $this->treeAge = $age;
 81         return trie;
 82     }
 83 
 84 }
 85 
 86 /**
 87  * 定義具體產品類 葡萄
 88  * 首先,我們要實現所繼承的接口所定義的方法
 89  * 然後定義葡萄所特有的屬性,以及方法
 90  */
 91 class grape implements fruit{
 92 
 93 
 94     //葡萄是否有籽
 95     private $seedLess;
 96 
 97     public function grow(){
 98         echo "apple grow";
 99     }
100 
101     public function plant(){
102         echo "apple plant";
103     }
104 
105     public function harvest(){
106         echo "apple harvest";
107     }
108 
109     public function eat(){
110         echo "apple eat";
111     }
112 
113     //有無籽取值
114     public function getSeedLess(){
115         return $this->seedLess;
116     }
117 
118     //設置有籽無籽
119     public function setSeedLess($seed){
120         $this->seedLess = $seed;
121         return true;
122     }
123 
124 }
125 
126 
127 /**
128  *農場主類 用來獲取實例化的水果
129  *
130  */
131 class farmer{
132 
133     //定義個靜態工廠方法
134     public static function factory($fruitName){
135         switch ($fruitName) {
136             case 'apple':
137                 return new apple();
138                 break;
139             case 'grape':
140                 return new grape();
141                 break;
142             default:
143                 throw new badFruitException("Error no the fruit", 1);
144                 break;
145         }
146     }
147 }
148 
149 class badFruitException extends Exception{
150     public $msg;
151     public $errType;
152     public function __construct($msg = '' , $errType = 1){
153         $this->msg = $msg;
154         $this->errType = $errType;
155     }    
156 }
157 
158 
159 /**
160  * 獲取水果實例化的方法
161  */
162 try{
163     $appleInstance = farmer::factory('apple');
164     var_dump($appleInstance);
165 }catch(badFruitException $err){
166     echo $err->msg . "_______" . $err->errType;
167 }

 


php設計模式: 寫出工廠模式與單態模式的PHP5示例代碼

Example #1 調用工廠方法(帶參數)

<?php
class Example
{
// The parameterized factory method
public static function factory($type)
{
if (include_once 'Drivers/' . $type . '.php') {
$classname = 'Driver_' . $type;
return new $classname;
} else {
throw new Exception ('Driver not found');
}
}
}
?>
------------------------------------
Example #2 單例模式

<?php
class Example
{
// 保存類實例在此屬性中
private static $instance;

// 構造方法聲明為private,防止直接創建對象
private function __construct()
{
echo 'I am constructed';
}

// singleton 方法
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}

return self::$instance;
}

// Example類中的普通方法
public function bark()
{
echo 'Woof!';
}

// 阻止用戶復制對象實例
public function __clone()
{
trigger_error('Clone is not allowed.', E_USER_ERROR);
}

}

?>
 

簡單工廠模式與工廠方法模式的相同點與不同點?

建議LZ把簡單工廠,工廠方法和抽象工廠一起研究下,呵呵,前一段我老師讓我研究下這3種模式的不同,一起學習可能更明白了。
簡單工廠模式又稱靜態工廠方法模式。重命名上就可以看出這個模式一定很簡單。它存在的目的很簡單:定義一個用於創建對象的接口。
先來看看它的組成:
1)工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯。在java中它往往由一個具體類實現。
2)抽象產品角色:它一般是具體產品繼承的父類或者實現的接口。在java中由接口或者抽象類來實現。
3)具體產品角色:工廠類所創建的對象就是此角色的實例。在java中由一個具體類實現。
工廠方法模式去掉了簡單工廠模式中工廠方法的靜態屬性,使得它可以被子類繼承。這樣在簡單工廠模式裡集中在工廠方法上的壓力可以由工廠方法模式裡不同的工廠子類來分擔。
看下它的組成:
1)抽象工廠角色: 這是工廠方法模式的核心,它與應用程序無關。是具體工廠角色必須實現的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現。
2) 具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程序調用以創建對應的具體產品的對象。
3)抽象產品角色:它是具體產品繼承的父類或者是實現的接口。在java中一般有抽象類或者接口來實現。
4)具體產品角色:具體工廠角色所創建的對象就是此角色的實例。在java中由具體的類來實現。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved