05、PHP 设计模式-工厂方法模式

工厂方法模式

工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

模式结构

工厂方法模式包含如下角色:

  • Product:抽象产品
  • ConcreteProduct:具体产品
  • Factory:抽象工厂
  • ConcreteFactory:具体工厂

结构图

 

PHP代码实现

<?php

// 产品接口定义了产品的操作
interface Product {
    public function operation(): string;
}

// 具体产品1实现产品接口
class ConcreteProduct1 implements Product {
    public function operation(): string {
        return "Result of ConcreteProduct1";
    }
}

// 具体产品2实现产品接口
class ConcreteProduct2 implements Product {
    public function operation(): string {
        return "Result of ConcreteProduct2";
    }
}

// 创建者类声明了工厂方法,该方法应该返回一个Product对象
abstract class Creator {
    abstract public function factoryMethod(): Product;

    // 创建者类中还可以包含一些依赖于Product对象的核心业务逻辑
    public function someOperation(): string {
        // 调用工厂方法创建一个Product对象
        $product = $this->factoryMethod();
        // 现在使用这个产品
        return "Creator: The same creator's code has just worked with " . $product->operation();
    }
}

// 具体创建者1重写工厂方法以改变最终产品的类型
class ConcreteCreator1 extends Creator {
    public function factoryMethod(): Product {
        return new ConcreteProduct1();
    }
}

// 具体创建者2重写工厂方法以改变最终产品的类型
class ConcreteCreator2 extends Creator {
    public function factoryMethod(): Product {
        return new ConcreteProduct2();
    }
}

// 客户端代码
function clientCode(Creator $creator) {
    // ...
    echo "Client: I'm not aware of the creator's class, but it still works.\n" . $creator->someOperation();
    // ...
}

// 应用中的代码可以使用任何创建者子类,无需依赖它们的具体类。
echo "App: Launched with the ConcreteCreator1.\n";
clientCode(new ConcreteCreator1());
echo "\n\n";

echo "App: Launched with the ConcreteCreator2.\n";
clientCode(new ConcreteCreator2());