工厂方法模式
工厂方法模式(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());