💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 概述 是类的创建模式,又叫做简单方法模式,静态产品模式是一个工厂对象决定创建出哪一种产品类的实例. ### 优点 使用静态工厂模式的优点是实现责任的分割,该模式的核心是工厂类,工厂类含有必要的选择逻辑,可以决定什么时候创建哪一个产品的实例,而客户端则免去直接创建产品的责任,而 仅仅是消费产品。也就是说静态工厂模式在不改变客户端代码的情况可以动态的增加产品。(总有人对静态工厂模式增加产品后客户端代码不改变存有疑问,这里指的不改变,是指原来的 消费产品的代码不必改变,您如果是要消费新的产品当然得把新的产品加上啊),也就在某种程度上满足开闭原则,但它并不完全满足开闭原则,因为没当增加新的产品时,都需要修 改工厂类,所以出现了以后的工厂方法模式。 ### 为什么工厂类中的方法必须是静态的? 其实这样不用静态的在语法上并没有错误,但却完全没理解面向对象设计的精髓。 如果直接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; } ~~~