工厂方法设计模式-PHP

1 php design-patterns factory

我正在阅读有关工厂设计模式的文章,该模式有 3 种形式:简单工厂、工厂方法和抽象工厂。

据我了解,简单工厂不是一种设计模式,它只是一种封装对象创建代码的类型,与 if/switch 语句结合使用,或者直接加载类,如果类不存在,则异常!

当我尝试转向工厂方法时,我找不到足够清晰的示例来将其从简单工厂中推迟。

你们能举一个例子来解释工厂方法以及它如何与简单工厂不同吗?

谢谢。

Ofi*_*ten 6

简单工厂

一个具有不同方法(或具有)的简单switch类,完全使用创建逻辑实现。在 PHP 中,它可以如下所示:

class AnimalFactory
{
    public function CreateAnimal($type)
    {
        if ($type == 'Dog') {
            return new Dog();
        } else {
            return new Cat();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果明天您要饲养一种新动物,则必须更改此类的实现。这里没有子类——这个类知道关于Animal创造的一切。

工厂方法

当您有一个类进行一些处理Animal但不知道如何或Animal创建哪些内容时,您会使用它,因此希望有子类来确定这一点。因此,我们创建一个子类可以重写的工厂方法。

abstract Class MyAnimalProcess
{
    abstract function CreateAnimal();

    public function Process()
    {
        $animal = $this->CreateAnimal();
        ...
        ...
    }
}

class DogProcess extends MyAnimalProcess
{
    function CreateAnimal()
    {
        return new Dog();
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,在这里您可以拥有一个抽象类,它可以对 an 执行某些操作Animal,但让它的子类决定Animal它是什么。

抽象工厂

将工厂方法向前推进了一步,将创建工作委托给另一个类——“工厂”类。
所以它使用组合而不是继承。

abstract class AnimalFactory
{
    public abstract function CreatePet();
    public abstract function CreateWildAnimal();
}

class DogAnimalFactory extends AnimalFactory
{
    public function CreatePet()
    {
        return new Dog();
    }

    public function CreateWildAnimal()
    {
        return new AfricanWildDog();
    }
}

class CatAnimalFactory extends AnimalFactory
{
    public function CreatePet()
    {
        return new Cat();
    }

    public function CreateWildAnimal()
    {
        return new Tiger();
    }
}

class MyAnimalProcess
{
    function __construct($animalFactory) {
        $this->factory = $animalFactory;
    }

    public function ProcessPet()
    {
        $animal = $this->factory->CreatePet();
        ...
        ...
    }

    public function ProcessWild()
    {
        $animal = $this->factory->CreateWild();
        ...
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)