什么是PHP中的工厂设计模式?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (57)

这以最简单的方式让我困惑,它有什么作用?

提问于
用户回答回答于

工厂创建一个对象。所以,如果你想建立

 class A{
    public $classb;
    public $classc;
    public function __construct($classb, $classc)
    {
         $this->classb = $classb;
         $this->classc = $classc;
    }
  }

每次创建对象时,您都不希望依赖于必须执行以下代码

$obj = new ClassA(new ClassB, new Class C);

这就是工厂进来的地方。我们为工厂定义一个工厂来照顾这个工厂:

class Factory{
    public function build()
    {
        $classc = $this->buildC();
        $classb = $this->buildB();
        return $this->buildA($classb, $classc);

    }

    public function buildA($classb, $classc)
    {
        return new ClassA($classb, $classc);
    }

    public function buildB()
    {
        return new ClassB;
    }

    public function buildC()
    {
        return new ClassC;
    }
}

现在我们所要做的就是

$factory = new Factory;
$obj     = $factory->build();

真正的优势是当你想改变班级时。假设我们想要通过一个不同的ClassC:

class Factory_New extends Factory{
    public function buildC(){
        return new ClassD;
    }
}

或新的ClassB:

class Factory_New2 extends Factory{
    public function buildB(){
        return new ClassE;
    }
}

现在我们可以使用继承来轻松修改类的创建方式,以便放入一组不同的类。

这个用户类可能是一个很好的例子:

class User{
    public $data;
    public function __construct($data)
    {
        $this->data = $data;
    }
}

这个班级$data是我们用来存储数据的班级。现在对于这个类,让我们说我们使用Session来存储我们的数据。工厂看起来像这样:

class Factory{
    public function build()
    {
        $data = $this->buildData();
        return $this->buildUser($data);
    }

    public function buildData()
    {
        return SessionObject();
    }

    public function buildUser($data)
    {
        return User($data);
    }
}

现在,我们可以说,我们希望将所有的数据存储在数据库中,改变它非常简单:

class Factory_New extends Factory{
    public function buildData()
    {
        return DatabaseObject();
    }
}

工厂是我们用来控制如何将对象放在一起的设计模式,使用正确的工厂模式可以让我们创建我们需要的自定义对象。

用户回答回答于

就像现实生活中的工厂一样,它创造出一些东西并将其返回。

想象一下这样的事情

$joe = new Joe();
$joe->say('hello');

或工厂方法

Joe::Factory()->say('hello');

工厂方法的实现将创建一个新实例并将其返回。

扫码关注云+社区