[toc]
## 舉個例子
**你想要哪種咖啡?**
> 咖啡機的使用非常簡單,咖啡機旁邊有已經準備好的咖啡豆,想要喝咖啡,只要往咖啡機里加入少許的咖啡豆,然后選擇杯數和濃度,再按一下開關,10分鐘后,帶著濃香味的咖啡就為你準備好了!當然,如果你想喝一些其他口味的咖啡,也可以自備咖啡豆,無論你是要拿鐵還是摩卡,這些都不是問題。
> 同一個咖啡機, 因為咖啡豆不同, 就可以產出不同的咖啡
## 代碼示例
```php
<?php
// 咖啡
class Coffee {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
public function getTaste() {
}
}
// 拿鐵咖啡
class CaffeLatte extends Coffee {
public function __construct($name) {
parent::__construct($name);
}
public function getTaste() {
return "輕柔而香醇。";
}
}
// 摩卡咖啡
class MochaCoffee extends Coffee {
public function __construct($name) {
parent::__construct($name);
}
public function getTaste() {
return "絲滑與醇厚。";
}
}
// 咖啡機
class Coffeemaker {
public static function makeCoffee($coffeeBean) {
$coffee = null;
if ($coffeeBean == "拿鐵風味咖啡豆") {
$coffee = new CaffeLatte("拿鐵咖啡");
} elseif ($coffeeBean == "摩卡風味咖啡豆") {
$coffee = new MochaCoffee("摩卡咖啡");
} else {
$coffee = new Coffee("普通咖啡");
}
return $coffee;
}
}
$latte = Coffeemaker::makeCoffee("拿鐵風味咖啡豆");
echo $latte->getName() . " 已為您準備好了,口感:" . $latte->getTaste() . " 請慢慢享用!" . PHP_EOL;
$mocha = Coffeemaker::makeCoffee("摩卡風味咖啡豆");
echo $mocha->getName() . " 已為您準備好了,口感:" . $mocha->getTaste() . " 請慢慢享用!" . PHP_EOL;
```
```
D:\soft\php72\php.exe D:\project\php_dp\index.php
拿鐵咖啡 已為您準備好了,口感:輕柔而香醇。 請慢慢享用!
摩卡咖啡 已為您準備好了,口感:絲滑與醇厚。 請慢慢享用!
Process finished with exit code 0
```
## 什么是簡單工廠模式?
> 專門定義一個類來負責創建其他類的實例,根據參數的不同創建不同類的實例,被創建的實例通常都具有共同的父類。
> 用來創建對象的類叫工廠類,比如上面示例中 CoffeeMaker 就是工廠類。
> 簡單工廠模式對創建過程抽象出單獨的一個類,將對象的創建和對象的使用過程進行分離,降低了系統的耦合度,使得兩者修改起來都相對容易。

## 優缺點
**簡單工廠的優點**
1. 抽象出一個專門的類來負責某類對象的創建,分割出創建的職責,不能直接去創建具體的對象,只要傳入適當的參數即可。
1. 使用者可以不用關注具體對象的類名稱,只知道傳入什么參數可以創建哪些需要的對象。
**簡單工廠的缺點**
1. 不易拓展,一旦添加新的產品類型,就不得不修改工廠的創建邏輯。
1. 產品類型較多時,工廠的創建邏輯可能過于復雜,一但出錯可能造成所以產品的創建失敗,不利于系統的維護。
## 應用場景
1. 產品具有明顯的繼承關系,且產品的類型不宜太多。
1. 產品具有相同的方法和類似的屬性,使用者不關心具體的類型,只希望傳入合適的參數能返回合適的對象。