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();
$product = $factory->createProduct('A');
echo $product->getName(); // 输出: Product A
工厂方法模式实现
工厂方法模式通过让子类决定实例化哪个类来实现对象的创建。
abstract class Creator {
abstract public function factoryMethod(): Product;
public function someOperation(): string {
$product = $this->factoryMethod();
return "Creator: " . $product->getName();
}
}
class ConcreteCreatorA extends Creator {
public function factoryMethod(): Product {
return new ConcreteProductA();
}
}
class ConcreteCreatorB extends Creator {
public function factoryMethod(): Product {
return new ConcreteProductB();
}
}
// 使用示例
$creator = new ConcreteCreatorA();
echo $creator->someOperation(); // 输出: Creator: Product A
抽象工厂模式实现
抽象工厂模式提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。

interface AbstractFactory {
public function createProductA(): ProductA;
public function createProductB(): ProductB;
}
class ConcreteFactory1 implements AbstractFactory {
public function createProductA(): ProductA {
return new ConcreteProductA1();
}
public function createProductB(): ProductB {
return new ConcreteProductB1();
}
}
class ConcreteFactory2 implements AbstractFactory {
public function createProductA(): ProductA {
return new ConcreteProductA2();
}
public function createProductB(): ProductB {
return new ConcreteProductB2();
}
}
// 使用示例
$factory = new ConcreteFactory1();
$productA = $factory->createProductA();
$productB = $factory->createProductB();
适用场景
工厂模式适用于需要灵活创建对象的场景,特别是当对象创建过程复杂或需要根据条件动态决定创建哪种对象时。通过工厂模式可以提高代码的可维护性和扩展性,降低客户端与具体实现类之间的耦合度。






