工厂模式(Factory Pattern)是什么
工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会向客户端暴露创建逻辑,而是使用一个共同的接口来指向新创建的对象。
工厂模式的优点
- 工厂模式可以帮助我们实现松耦合,它将客户端代码与实际创建对象的代码分离开来;
- 工厂模式可以帮助我们封装变化,客户端代码无需知道实际创建的对象,只需知道工厂即可;
- 工厂模式可以帮助我们实现单一职责原则,一个类只负责一个职责,由工厂类负责创建对象。
工厂模式的实现
在 PHP 中,我们可以使用以下方式来实现工厂模式:
1. 简单工厂模式
简单工厂模式是一种将创建逻辑封装在一个类中的工厂模式。在简单工厂模式中,我们使用一个工厂类来创建所有的对象,根据传入的参数不同来返回不同的对象实例。
<?php // 定义接口 interface Car { public function run(); } // 实现接口 class Benz implements Car { public function run() { echo 'Benz is running...'; } } // 实现接口 class Bmw implements Car { public function run() { echo 'Bmw is running...'; } } // 工厂类 class CarFactory { public static function createCar($type) { switch ($type) { case 'Benz': return new Benz(); case 'Bmw': return new Bmw(); default: throw new Exception('Undefined car type.'); } } } // 使用 $car1 = CarFactory::createCar('Benz'); $car1->run(); // output: Benz is running... $car2 = CarFactory::createCar('Bmw'); $car2->run(); // output: Bmw is running...
2. 工厂方法模式
工厂方法模式是一种将对象的创建委托给具体的工厂类来完成的工厂模式。在工厂方法模式中,我们定义一个创建对象的接口,由子类来决定实例化哪个类。
<?php // 定义接口 interface Car { public function run(); } // 实现接口 class Benz implements Car { public function run() { echo 'Benz is running...'; } } // 实现接口 class Bmw implements Car { public function run() { echo 'Bmw is running...'; } } // 定义工厂接口 interface CarFactory { public function createCar(); } // 实现工厂接口 class BenzFactory implements CarFactory { public function createCar() { return new Benz(); } } // 实现工厂接口 class BmwFactory implements CarFactory { public function createCar() { return new Bmw(); } } // 使用 $benzFactory = new BenzFactory(); $car1 = $benzFactory->createCar(); $car1->run(); // output: Benz is running... $bmwFactory = new BmwFactory(); $car2 = $bmwFactory->createCar(); $car2->run(); // output: Bmw is running...
3. 抽象工厂模式
抽象工厂模式是一种将多个对象的创建委托给具体的工厂类来完成的工厂模式。在抽象工厂模式中,我们定义一个抽象工厂接口,由具体的工厂类来实现该接口,创建多个相关的对象。
<?php // 定义接口 interface Car { public function run(); } // 实现接口 class Benz implements Car { public function run() { echo 'Benz is running...'; } } // 实现接口 class Bmw implements Car { public function run() { echo 'Bmw is running...'; } } // 定义抽象工厂接口 interface CarFactory { public function createBenz(); public function createBmw(); } // 实现抽象工厂接口 class Factory implements CarFactory { public function createBenz() { return new Benz(); } public function createBmw() { return new Bmw(); } } // 使用 $factory = new Factory(); $car1 = $factory->createBenz(); $car1->run(); // output: Benz is running... $car2 = $factory->createBmw(); $car2->run(); // output: Bmw is running...
总结
工厂模式是一种非常常见的创建型模式,它可以帮助我们封装变化,实现松耦合,同时遵循单一职责原则。在实际开发中,我们可以根据具体的需求,选择不同的工厂模式来实现对象的创建。