Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
工厂方法设计模式-PHP_Php_Design Patterns_Factory - Fatal编程技术网

工厂方法设计模式-PHP

工厂方法设计模式-PHP,php,design-patterns,factory,Php,Design Patterns,Factory,我在读关于工厂设计模式的书,这个模式有三种形式,简单工厂,工厂方法和抽象工厂 据我所知,简单工厂不是一种设计模式,它只是一种封装对象创建代码的类型,与if/switch语句结合使用,或者直接加载类(如果类不存在的话) 当我尝试转移到工厂方法时,我找不到一个足够清晰的例子来将它从简单的工厂推迟 你们能举个例子来解释工厂方法,以及它是如何从简单工厂中分离出来的吗 多谢各位 简单工厂 一个具有不同方法的简单类(或具有开关的类),完全使用创建逻辑实现。在PHP中,它可以如下所示: class Anima

我在读关于工厂设计模式的书,这个模式有三种形式,简单工厂,工厂方法和抽象工厂

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

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

你们能举个例子来解释工厂方法,以及它是如何从简单工厂中分离出来的吗


多谢各位

简单工厂

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

class AnimalFactory
{
    public function CreateAnimal($type)
    {
        if ($type == 'Dog') {
            return new Dog();
        } else {
            return new Cat();
        }
    }
}
如果tommorow需要支持一个新的动物,则必须更改该类的实现。 这里没有子类-这个类知道关于
Animal
创建的一切

工厂方法

当您有一个类对
Animal
进行某些处理,但还不知道如何创建或创建哪个
Animal
时,您将使用它,因此希望有子类来确定这一点。所以我们创建了一个工厂方法,sucblasses可以覆盖它

abstract Class MyAnimalProcess
{
    abstract function CreateAnimal();

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

class DogProcess extends MyAnimalProcess
{
    function CreateAnimal()
    {
        return new Dog();
    }
}
因此,这里您可以使用一个抽象类来处理
动物
,但是让它的子类来确定它将是哪个
动物

抽象工厂

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

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();
        ...
        ...
    }
}

简单工厂

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

class AnimalFactory
{
    public function CreateAnimal($type)
    {
        if ($type == 'Dog') {
            return new Dog();
        } else {
            return new Cat();
        }
    }
}
如果tommorow需要支持一个新的动物,则必须更改该类的实现。 这里没有子类-这个类知道关于
Animal
创建的一切

工厂方法

当您有一个类对
Animal
进行某些处理,但还不知道如何创建或创建哪个
Animal
时,您将使用它,因此希望有子类来确定这一点。所以我们创建了一个工厂方法,sucblasses可以覆盖它

abstract Class MyAnimalProcess
{
    abstract function CreateAnimal();

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

class DogProcess extends MyAnimalProcess
{
    function CreateAnimal()
    {
        return new Dog();
    }
}
因此,这里您可以使用一个抽象类来处理
动物
,但是让它的子类来确定它将是哪个
动物

抽象工厂

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

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();
        ...
        ...
    }
}

也许这会有帮助,让事情变得更清楚,
抽象工厂是工厂方法的集合

现实生活中的例子:
-橡皮泥/霉菌

-卡片工厂

也许这会有帮助,更清楚地说,
抽象工厂是工厂方法的集合

现实生活中的例子:
-橡皮泥/霉菌

-卡片工厂

当您必须检查子类中的类型以创建实例时,特定工厂方法如何有用?当您必须检查子类中的类型以创建实例时,特定工厂方法如何有用?