PHP中“简单工厂模式”实例代码讲解


在PHP中,简单工厂模式是一种创建型设计模式,它用于创建对象而不将客户端与具体类的创建逻辑耦合。客户端通过传递一个类型标识符给工厂类来请求创建对象,工厂类根据这个标识符决定实例化哪个类。以下是一个简单工厂模式的PHP示例代码及讲解。

### 示例代码

首先,我们定义几个产品接口和具体产品类:


interface Product {
    public function operation(): string;
}

class ConcreteProductA implements Product {
    public function operation(): string {
        return "Operation A";
    }
}

class ConcreteProductB implements Product {
    public function operation(): string {
        return "Operation B";
    }
}

// 简单工厂类
class ProductFactory {
    public static function createProduct($type): Product {
        switch ($type) {
            case 'A':
                return new ConcreteProductA();
            case 'B':
                return new ConcreteProductB();
            default:
                throw new Exception('Invalid product type');
        }
    }
}

// 客户端代码
$productA = ProductFactory::createProduct('A');
echo $productA->operation(); // 输出: Operation A

$productB = ProductFactory::createProduct('B');
echo $productB->operation(); // 输出: Operation B

### 讲解

1. **接口定义**:`Product` 接口定义了一个所有产品都必须实现的方法 `operation()`。这是一个典型的工厂模式中的产品接口。

2. **具体产品类**:`ConcreteProductA` 和 `ConcreteProductB` 是实现了 `Product` 接口的具体产品类。它们各自实现了 `operation()` 方法,返回不同的字符串。

3. **工厂类**:`ProductFactory` 是一个静态工厂类,它包含了一个静态方法 `createProduct()`。这个方法接收一个类型标识符(在这个例子中是字符串 'A' 或 'B'),并根据这个标识符返回相应的具体产品类的实例。如果传入的类型标识符无效,则抛出异常。

4. **客户端代码**:客户端代码通过调用 `ProductFactory::createProduct()` 方法来请求创建产品对象,并传入所需的类型标识符。然后,客户端可以调用产品对象上的方法来执行操作。

简单工厂模式的主要优点是它解耦了客户端与具体产品的创建逻辑。客户端不需要知道具体产品类的名称,只需要知道产品接口和类型标识符即可。这样,如果需要添加新的产品类,只需要修改工厂类即可,而不需要修改客户端代码,这符合开闭原则。然而,简单工厂模式的缺点是当产品类型非常多时,工厂类的代码可能会变得非常庞大和难以维护。