### 概述
是類的創建模式,又叫做簡單方法模式,靜態產品模式是一個工廠對象決定創建出哪一種產品類的實例.
### 優點
使用靜態工廠模式的優點是實現責任的分割,該模式的核心是工廠類,工廠類含有必要的選擇邏輯,可以決定什么時候創建哪一個產品的實例,而客戶端則免去直接創建產品的責任,而
僅僅是消費產品。也就是說靜態工廠模式在不改變客戶端代碼的情況可以動態的增加產品。(總有人對靜態工廠模式增加產品后客戶端代碼不改變存有疑問,這里指的不改變,是指原來的
消費產品的代碼不必改變,您如果是要消費新的產品當然得把新的產品加上啊),也就在某種程度上滿足開閉原則,但它并不完全滿足開閉原則,因為沒當增加新的產品時,都需要修
改工廠類,所以出現了以后的工廠方法模式。
### 為什么工廠類中的方法必須是靜態的?
其實這樣不用靜態的在語法上并沒有錯誤,但卻完全沒理解面向對象設計的精髓。
如果直接new出Factory的對象,客戶端就必須自己控制工廠類的構造和生成,客戶端必須非常清楚工廠的構造函數(比如構造函數有多少個參數,輸入參數時有什么條件等等),也知道
工廠的內部細節,一旦工廠擴展或者改變了,客戶端在沒有得到通知的情況下就不知道怎么調用了。而是用靜態方法構造客戶端則完全不關心你是如何構造對象的所以客戶端不需要了解
工廠的構造細節,一旦工廠內部發生變化,客戶端也不需要關心。它只需要關心最后的結果就行了,因為所有的細節都在工廠內部被處理完了。
### 實例
~~~
/**
* 虛擬產品接口
*/
interface Fruit{
public function grow(); //生長
public function plant(); //種植
public function harvest(); //收獲
public function eat(); //食用
}
/**
* 定義具體產品,實現接口
*/
class Apple implements Fruit{
private $treeAge;
private $color;
public function grow()
{
echo "apple grow";
}
public function plant()
{
echo "apple plant";
}
public function harvest()
{
echo "apple harvest";
}
public function eat()
{
echo "apple eat";
}
public function getTreeAge()
{
return $this->treeAge;
}
public function setTreeAge($age)
{
$this->treeAge = $age;
return true;
}
}
class Grape implements Fruit{
private $seedLess;
public function grow()
{
echo "grape grow";
}
public function plant()
{
echo "grape plant";
}
public function harvest()
{
echo "grape harvest";
}
public function eat()
{
echo "grape eat";
}
public function getSeedLess()
{
return $this->seedLess;
}
public function setSeedLess($seed)
{
$this->seedLess = $seed;
return true;
}
}
/**
* 定義靜態工廠
*/
class Factory{
public static function create($fruitName)
{
switch($fruitName){
case "Apple":
return new Apple();
break;
case "Grape":
return new Grape();
break;
default:
throw new badFruitException("Error no the fruit");
break;
}
}
}
class badFruitException extends Exception{
public $msg;
public $errType;
public function __construct($message = "", $code = 1, Throwable $previous = null)
{
$this->msg = $message;
$this->errType = $code;
}
}
try{
$appleInstance = Factory::create("Apple");
var_dump($appleInstance);
} catch(badFruitException $err){
echo $err->msg . "--" . $err->errType;
}
~~~
- PHP加密技術
- md5加密
- Crypt加密
- 函數
- 概述
- 強類型參數
- 可變參數列表
- 值傳遞&引用傳遞
- 變量作用域
- 可變函數
- 嵌套函數
- 遞歸函數
- 匿名函數(閉包)
- 面向對象
- 概念
- 類
- 對象的傳值
- 對象的克隆
- 構造方法
- 析構方法
- 克隆方法
- $this
- 類常量
- 靜態屬性
- 靜態方法
- 繼承
- 重寫
- 重載
- 概述
- 屬性重載
- 概述
- __set()
- __get()
- __unset()
- __isset()
- 方法重載
- 概述
- __call()
- __callstatic()
- 封裝
- 最終類
- 抽象類
- 接口
- 對象的序列化與反序列化
- __sleep()
- __wakeup()
- 其他魔術方法
- 對象的遍歷
- 類和對象相關函數
- 錯誤
- 概述
- 設置錯誤級別
- trigger_error()觸發錯誤
- 處理PHP中的錯誤
- 異常
- 概述
- 自定義異常類
- 自定義文件寫入異常類
- 記錄和發送異常信息
- 使用觀察者模式處理異常信息
- 自定義異常處理器
- 設計模式
- 創建型
- 單例模式
- 工廠模式
- 原型模式
- 結構型
- 注冊樹模式
- 適配器模式
- 數據映射模式
- 裝飾器模式
- 代理模式
- 行為型
- 策略模式
- 觀察者模式
- 迭代器模式
- 網絡
- cURL
- Oauth2.0
- QQ第三方登錄
- TCP/IP協議
- 概述
- HTTP協議
- 概述
- HTTP請求協議
- HTTP響應協議
- WebSocket
- 安裝擴展
- Redis
- Socket
- 計算機通信
- socket簡介
- PHP操作socket
- TCP
- HTTP服務端
- WebSocket
- PHP7
- 生成器yield
- 異常finally
- CGI和FPM
- php有用命令
- 內存