工厂模式是什么?如何在PHP中实现工厂模式?
工厂模式(Factory Pattern)是一种创建型设计模式,旨在提供一种创建对象的最佳方式,而无需指定创建对象的具体类。这种模式通过使用工厂方法来创建对象,将客户端代码与对象的具体实现分离,从而提高了代码的灵活性和可维护性。
在PHP中实现工厂模式通常可以采用以下几种方式:简单工厂模式、工厂方法模式和抽象工厂模式。我们逐一来看如何实现这些模式:
1. 简单工厂模式
简单工厂模式是最基本的工厂模式,它通过一个工厂类来创建对象。具体的对象创建逻辑被封装在工厂类中,客户端只需要通过工厂类来创建所需的对象,而无需关心对象的具体实现。
php// 产品接口
interface Product {
public function operation(): string;
}
// 具体产品类 A
class ConcreteProductA implements Product {
public function operation(): string {
return "ConcreteProductA";
}
}
// 具体产品类 B
class ConcreteProductB implements Product {
public function operation(): string {
return "ConcreteProductB";
}
}
// 简单工厂类
class SimpleFactory {
public function createProduct($type): Product {
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->operation(); // 输出: ConcreteProductA
$productB = $factory->createProduct('B');
echo $productB->operation(); // 输出: ConcreteProductB
2. 工厂方法模式
工厂方法模式通过定义一个创建对象的接口,但是让子类决定实例化哪个类。这样客户端代码在不需要知道具体产品类的情况下,就可以通过子类来创建所需的对象。
php// 产品接口
interface Product {
public function operation(): string;
}
// 具体产品类 A
class ConcreteProductA implements Product {
public function operation(): string {
return "ConcreteProductA";
}
}
// 具体产品类 B
class ConcreteProductB implements Product {
public function operation(): string {
return "ConcreteProductB";
}
}
// 工厂接口
interface Factory {
public function createProduct(): Product;
}
// 具体工厂类 A
class ConcreteFactoryA implements Factory {
public function createProduct(): Product {
return new ConcreteProductA();
}
}
// 具体工厂类 B
class ConcreteFactoryB implements Factory {
public function createProduct(): Product {
return new ConcreteProductB();
}
}
// 客户端代码
$factoryA = new ConcreteFactoryA();
$productA = $factoryA->createProduct();
echo $productA->operation(); // 输出: ConcreteProductA
$factoryB = new ConcreteFactoryB();
$productB = $factoryB->createProduct();
echo $productB->operation(); // 输出: ConcreteProductB
3. 抽象工厂模式
抽象工厂模式提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。它是工厂方法模式的推广,它不单单创建一个对象,而是创建一组对象,这些对象通常是相关的。
php// 抽象产品 A
interface AbstractProductA {
public function operationA(): string;
}
// 具体产品 A1
class ConcreteProductA1 implements AbstractProductA {
public function operationA(): string {
return "ConcreteProductA1";
}
}
// 具体产品 A2
class ConcreteProductA2 implements AbstractProductA {
public function operationA(): string {
return "ConcreteProductA2";
}
}
// 抽象产品 B
interface AbstractProductB {
public function operationB(): string;
}
// 具体产品 B1
class ConcreteProductB1 implements AbstractProductB {
public function operationB(): string {
return "ConcreteProductB1";
}
}
// 具体产品 B2
class ConcreteProductB2 implements AbstractProductB {
public function operationB(): string {
return "ConcreteProductB2";
}
}
// 抽象工厂接口
interface AbstractFactory {
public function createProductA(): AbstractProductA;
public function createProductB(): AbstractProductB;
}
// 具体工厂 1
class ConcreteFactory1 implements AbstractFactory {
public function createProductA(): AbstractProductA {
return new ConcreteProductA1();
}
public function createProductB(): AbstractProductB {
return new ConcreteProductB1();
}
}
// 具体工厂 2
class ConcreteFactory2 implements AbstractFactory {
public function createProductA(): AbstractProductA {
return new ConcreteProductA2();
}
public function createProductB(): AbstractProductB {
return new ConcreteProductB2();
}
}
// 客户端代码
$factory1 = new ConcreteFactory1();
$productA1 = $factory1->createProductA();
echo $productA1->operationA(); // 输出: ConcreteProductA1
$productB1 = $factory1->createProductB();
echo $productB1->operationB(); // 输出: ConcreteProductB1
$factory2 = new ConcreteFactory2();
$productA2 = $factory2->createProductA();
echo $productA2->operationA(); // 输出: ConcreteProductA2
$productB2 = $factory2->createProductB();
echo $productB2->operationB(); // 输出: ConcreteProductB2
通过这些示例,你可以看到不同类型的工厂模式在PHP中的实现方式。每种工厂模式都有其适用的场景和优缺点,具体选择取决于你的项目需求和设计目标。