簡單工廠模式 【靜態工廠方法模式】(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 }
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中由具體的類來實現。