首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >工厂方法设计模式-PHP

工厂方法设计模式-PHP
EN

Stack Overflow用户
提问于 2017-03-12 19:58:41
回答 2查看 2.9K关注 0票数 1

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

据我所知,简单的工厂不是一种设计模式,它只是一种将对象创建代码与if/switch语句结合在一起封装的类型,或者在类不存在的情况下为类直接加载异常!

当我试图转移到工厂方法时,我找不到足够清楚的例子来推迟简单工厂的操作。

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-13 09:18:21

简单工厂

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

代码语言:javascript
运行
复制
class AnimalFactory
{
    public function CreateAnimal($type)
    {
        if ($type == 'Dog') {
            return new Dog();
        } else {
            return new Cat();
        }
    }
}

如果明天您将有一个新的动物支持,您将不得不更改这个类的实现。这里没有子类--这个类知道创建Animal的所有知识。

工厂方法

当您有一个类对Animal进行一些处理,但还不知道如何创建或创建哪个Animal时,您使用的是什么,因此希望有子类来决定这一点。因此,我们创建了一个工厂方法,傻瓜可以覆盖。

代码语言:javascript
运行
复制
abstract Class MyAnimalProcess
{
    abstract function CreateAnimal();

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

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

因此,这里可以有和抽象类来处理Animal,但是让它的子类决定它将是哪一个Animal

抽象工厂

将工厂方法向前推进一步,并将创建委托给另一个类--“工厂”类。

所以它使用组合而不是继承。

代码语言:javascript
运行
复制
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();
        ...
        ...
    }
}
票数 6
EN

Stack Overflow用户

发布于 2017-03-14 08:06:06

也许这会有帮助,让它更清楚,

摘要工厂是工厂方法的集合。

现实生活中的例子:

工厂法 -塑料制品/模具

抽象工厂卡厂

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42752390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档