php 工厂模式 实现
工厂模式简介
工厂模式是一种创建型设计模式,用于在不暴露具体实现逻辑的情况下创建对象。通过定义一个公共接口或抽象类来创建对象,子类决定实例化哪个类。PHP中常用简单工厂、工厂方法和抽象工厂三种实现方式。

简单工厂模式
通过一个工厂类根据传入参数动态决定创建哪种产品类的实例。

interface Product {
public function getName();
}
class ConcreteProductA implements Product {
public function getName() {
return "Product A";
}
}
class ConcreteProductB implements Product {
public function getName() {
return "Product B";
}
}
class SimpleFactory {
public function createProduct($type) {
switch ($type) {
case 'A':
return new ConcreteProductA();
case 'B':
return new ConcreteProductB();
default:
throw new InvalidArgumentException("Invalid product type");
}
}
}
// 使用示例
$factory = new SimpleFactory();
$productA = $factory->createProduct('A');
echo $productA->getName(); // 输出: Product A
工厂方法模式
定义一个创建对象的接口,让子类决定实例化哪个类。核心是延迟实例化到子类。
interface Product {
public function getName();
}
class ConcreteProductA implements Product {
public function getName() {
return "Product A";
}
}
class ConcreteProductB implements Product {
public function getName() {
return "Product B";
}
}
abstract class Creator {
abstract public function factoryMethod(): Product;
public function someOperation() {
$product = $this->factoryMethod();
return $product->getName();
}
}
class ConcreteCreatorA extends Creator {
public function factoryMethod(): Product {
return new ConcreteProductA();
}
}
class ConcreteCreatorB extends Creator {
public function factoryMethod(): Product {
return new ConcreteProductB();
}
}
// 使用示例
$creatorA = new ConcreteCreatorA();
echo $creatorA->someOperation(); // 输出: Product A
抽象工厂模式
提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。适用于产品族场景。
interface AbstractProductA {
public function getName();
}
interface AbstractProductB {
public function getName();
}
class ConcreteProductA1 implements AbstractProductA {
public function getName() {
return "Product A1";
}
}
class ConcreteProductB1 implements AbstractProductB {
public function getName() {
return "Product B1";
}
}
interface AbstractFactory {
public function createProductA(): AbstractProductA;
public function createProductB(): AbstractProductB;
}
class ConcreteFactory1 implements AbstractFactory {
public function createProductA(): AbstractProductA {
return new ConcreteProductA1();
}
public function createProductB(): AbstractProductB {
return new ConcreteProductB1();
}
}
// 使用示例
$factory = new ConcreteFactory1();
$productA = $factory->createProductA();
$productB = $factory->createProductB();
echo $productA->getName(); // 输出: Product A1
echo $productB->getName(); // 输出: Product B1
模式选择建议
- 简单工厂:适合对象创建逻辑简单且变化少的场景
- 工厂方法:需要扩展性强,支持新增产品类型
- 抽象工厂:需要创建多个相关联的产品族
所有实现均遵循依赖倒置原则,客户端代码只依赖抽象接口,与具体实现解耦。






