💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[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. 产品具有相同的方法和类似的属性,使用者不关心具体的类型,只希望传入合适的参数能返回合适的对象。