[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 就是工厂类。
> 简单工厂模式对创建过程抽象出单独的一个类,将对象的创建和对象的使用过程进行分离,降低了系统的耦合度,使得两者修改起来都相对容易。
![](https://box.kancloud.cn/e66812d26bff1c09811a59cbcbcfc4f2_552x324.png)
## 优缺点
**简单工厂的优点**
1. 抽象出一个专门的类来负责某类对象的创建,分割出创建的职责,不能直接去创建具体的对象,只要传入适当的参数即可。
1. 使用者可以不用关注具体对象的类名称,只知道传入什么参数可以创建哪些需要的对象。
**简单工厂的缺点**
1. 不易拓展,一旦添加新的产品类型,就不得不修改工厂的创建逻辑。
1. 产品类型较多时,工厂的创建逻辑可能过于复杂,一但出错可能造成所以产品的创建失败,不利于系统的维护。
## 应用场景
1. 产品具有明显的继承关系,且产品的类型不宜太多。
1. 产品具有相同的方法和类似的属性,使用者不关心具体的类型,只希望传入合适的参数能返回合适的对象。