工厂方法模式

描述:在子类中实现父类的抽象方法
不需要修改工厂类,只需要添加就行。符合开闭原则

// 商品接口的实现类
interface Product2
{
    function show(): void;
}
class ConcreateProductA implements Product2
{
    public function show(): void
    {
        echo '我是商品A', PHP_EOL;
    }
}
class ConcreateProductB implements Product2
{
    public function show(): void
    {
        echo '我是商品B', PHP_EOL;
    }
}
// 工厂的抽象类与创建类
abstract class Creator
{
    // 抽象工厂方法
    abstract protected function FactoryMethod(): Product2;

    // 操作方法
    public function AnOperation(): Product2
    {
        return $this->FactoryMethod();
    }
}
class ConcreateCreatorA extends Creator
{
    // 实现操作方法
    protected function FactoryMethod(): Product2
    {
        return new ConcreateProductA();
    }
}
class ConcreateCreatorB extends Creator
{
    protected function FactoryMethod(): Product2
    {
        return new ConcreateProductB();
    }
}
// 测试
$factoryA = new ConcreateCreatorA();
$factoryB = new ConcreateCreatorB();
$factoryA->AnOperation()->show();
$factoryB->AnOperation()->show();