工厂方法设计模式-PHP

时间:2017-03-12 19:58:41

标签: php design-patterns factory

我正在阅读工厂设计模式,这个模式有3种形式,简单工厂,工厂方法和抽象工厂。

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

当我尝试转向工厂方法时,我找不到一个足够清晰的例子来推迟简单工厂。

你们能举个例子来解释工厂方法以及它如何从简单的工厂推迟?

谢谢。

2 个答案:

答案 0 :(得分:2)

简单工厂

使用创建逻辑完全实现的具有不同方法的简单类(或具有switch的方法)。在PHP中它看起来像:

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

如果你有一个新的动物要支持,你将不得不改变这个类的实现。 这里没有子类 - 这个类知道有关Animal创建的所有内容。

工厂方法

当你有一个类使用Animal进行某些处理但是不知道如何创建Animal时,你使用的是什么,因此希望有子类来确定那。因此,我们创建了一个可以覆盖的工厂方法。

abstract Class MyAnimalProcess
{
    abstract function CreateAnimal();

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

class DogProcess extends MyAnimalProcess
{
    function CreateAnimal()
    {
        return new Dog();
    }
}

所以,在这里你可以拥有和抽象类使用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();
        ...
        ...
    }
}

答案 1 :(得分:0)

也许这会有所帮助,使其更清楚,
抽象工厂是工厂方法的集合。

现实生活中的例子:
Factory Method - 橡皮泥/模具
Abstract Factory - 卡片工厂