工厂模式通过将对象创建集中管理,降低耦合并提升扩展性;简单工厂用静态方法创建不同产品,工厂方法让子类决定实例化哪个类,抽象工厂则创建一组相关产品;适用于对象创建逻辑复杂、需解耦或统一管理的场景,但需避免过度设计。

工厂模式在PHP中主要用于将对象的创建逻辑从使用对象的客户端代码中分离出来。它的核心思想是提供一个创建对象的方法或接口,但让子类决定实例化哪一个具体类。这能有效降低代码的耦合度,让系统在面对新对象类型时更易于扩展和维护。简单来说,就是把“new”操作集中管理起来,而不是让它散落在代码的各个角落。
要在PHP中实现工厂模式,我们通常会从一个相对简单的“简单工厂”开始理解,因为它最直观。虽然它不是GoF(Gang of Four)定义的23种设计模式之一,但在实际开发中非常常见且实用。
我们以一个创建不同类型汽车的场景为例。
首先,定义一个产品接口,所有具体产品都将实现这个接口。这确保了所有产品都有一个共同的契约。
立即学习“PHP免费学习笔记(深入)”;
<?php
// 1. 产品接口
interface Car
{
public function drive(): string;
public function getType(): string;
}
// 2. 具体产品A
class SportsCar implements Car
{
public function drive(): string
{
return "Driving a fast Sports Car!";
}
public function getType(): string
{
return "Sports Car";
}
}
// 3. 具体产品B
class FamilyCar implements Car
{
public function drive(): string
{
return "Driving a comfortable Family Car.";
}
public function getType(): string
{
return "Family Car";
}
}
// 4. 工厂类
class CarFactory
{
/**
* 根据类型创建汽车实例
*
* @param string $type 汽车类型 (e.g., 'sports', 'family')
* @return Car
* @throws InvalidArgumentException
*/
public static function createCar(string $type): Car
{
switch ($type) {
case 'sports':
return new SportsCar();
case 'family':
return new FamilyCar();
default:
throw new InvalidArgumentException("Unknown car type: " . $type);
}
}
}
// 客户端代码如何使用工厂
$sportsCar = CarFactory::createCar('sports');
echo $sportsCar->drive() . " (Type: " . $sportsCar->getType() . ")\n";
$familyCar = CarFactory::createCar('family');
echo $familyCar->drive() . " (Type: " . $familyCar->getType() . ")\n";
// 尝试创建不存在的类型
try {
$unknownCar = CarFactory::createCar('truck');
echo $unknownCar->drive() . "\n";
} catch (InvalidArgumentException $e) {
echo "Error: " . $e->getMessage() . "\n";
}在这个例子中:
Car
SportsCar
FamilyCar
CarFactory
createCar
CarFactory
SportsCar
FamilyCar
new
我个人觉得,当你发现代码里充斥着大量的
new ConcreteProduct()
new
具体来说,工厂模式特别适合以下几种情况:
它本质上就是把“变化”封装起来,让核心业务逻辑更加稳定。当你发现某个
new
if/else if/else
switch
我刚开始学设计模式时,这几个“工厂”把我搞得晕头转向。后来才明白,它们就像是生产线的不同进化阶段,解决的问题复杂度和侧重点都不一样。
简单工厂 (Simple Factory)
create
switch
case
工厂方法 (Factory Method)
概念: 这是GoF定义的一种创建型模式。它定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。工厂方法把对象的创建延迟到子类。
特点: 每个具体产品都有一个对应的具体工厂。当需要添加新产品时,你只需要添加新的具体产品类和新的具体工厂类,而不需要修改现有代码,完全符合开闭原则。
结构:
PHP示例(简化):
// Product 接口同上
// ConcreteProduct (SportsCar, FamilyCar) 同上
// Creator 抽象类
abstract class CarCreator
{
abstract public function createCar(): Car; // 工厂方法
}
// ConcreteCreator A
class SportsCarCreator extends CarCreator
{
public function createCar(): Car
{
return new SportsCar();
}
}
// ConcreteCreator B
class FamilyCarCreator extends CarCreator
{
public function createCar(): Car
{
return new FamilyCar();
}
}
// 客户端使用
$sportsCarCreator = new SportsCarCreator();
$mySportsCar = $sportsCarCreator->createCar();
echo $mySportsCar->drive() . "\n";
$familyCarCreator = new FamilyCarCreator();
$myFamilyCar = $familyCarCreator->createCar();
echo $myFamilyCar->drive() . "\n";适用场景: 当一个类不知道它所必须创建的对象的类,或者一个类希望由其子类来指定它所创建的对象时。
抽象工厂 (Abstract Factory)
总结一下,简单工厂是“一个工厂生产多种产品”,工厂方法是“每种产品都有一个专属工厂”,而抽象工厂是“一个工厂生产一族相关产品”。它们各自应对不同复杂度的对象创建需求。
说实话,刚接触工厂模式的时候,觉得它简直是银弹,什么都想用它来包一层。但用多了就会发现,它也不是万能的。有时候为了“模式”而模式,反而把代码搞得更复杂了。
new
所以,在决定使用工厂模式之前,最好先评估一下当前项目的规模、复杂度和未来的扩展需求。如果只是临时性的简单创建,或者项目已经在使用成熟的DI容器,那么过度地引入工厂模式可能适得其反。设计模式是为了解决问题而存在的,而不是为了炫技或者盲目追随。找到一个平衡点,让代码既能保持清晰的逻辑,又能适应未来的变化,才是最重要的。
以上就是php如何实现工厂模式?PHP工厂设计模式构建方法的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号