![](https://source.unsplash.com/random/1680x200) ## 工厂方法模式(Factory Method) **概述:** 定义一个用于创建对象的接口,让子类决定实例化哪一个类。 **简述:** 工厂模式是另一种非常常用的模式,正如其名字所示:确实是对象实例的生产工厂。某些意义上,工厂模式提供了通用的方法有助于我们去获取对象,而不需要关心其具体的内在的实现。 **适用性:** 1. 当一个类不知道它所必须创建的对象的类的时候。 2. 当一个类希望由它的子类来指定它所创建的对象的时候。 3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。 **UML图** ![](https://img.kancloud.cn/24/fe/24feb8707eeb8874dcec972d631923ce_598x401.jpg) **简单实例** ``` // 工厂接口 interface FactoryInterface { /** * @Desc: 创建操作系统 * @param string $type 系统类型 * @return mixed */ public function createSystem($type); } // 工厂 class Factory implements FactoryInterface { // 实现工厂方法 public function createSystem($type) { switch ($type) { case 'mac': return new MacSystem(); case 'windows': return new WindowSystem(); case 'linux': return new LinuxSystem(); } } } // 操作系统接口 interface SystemInterface { /** * @Desc: 开机 * @return mixed */ public function boot(); /** * @Desc: 关机 * @return mixed */ public function shutDown(); } // Windows操作系统 class WindowSystem implements SystemInterface { public function boot() { echo 'Windows 10 开机'; } public function shutDown() { echo 'Windows 10 关机'; } } // Linux操作系统 class LinuxSystem implements SystemInterface { public function boot() { echo 'Linux 开机'; } public function shutDown() { echo 'Linux 关机'; } } ``` **使用** ``` // 创建工厂实例 $factory = new Factory(); // 通过工厂实例创建windows系统 $windows = $factory->createSystem('windows'); // Windows 开机 echo $windows->boot()."<br/>"; // Linux 开机 $linux = $factory->createSystem('linux'); echo $linux->boot()."<br/>"; echo $linux->shutDown(); ``` > 输出内容: Windows 10 开机 Linux 开机 Linux 关机