此方案是否需要工厂模式?

时间:2016-05-11 09:47:15

标签: php design-patterns yii yii2

我有一个Model可以跨不同的控制器或类创建。这方面的一个示例是AController使用ModelController中的相同逻辑创建模型可能需要的方案。因此,有关创建此模型的一些事实是:

  • 它不依赖于我的域空间中的任何其他模型。
  • 它包含的逻辑比通常的(new Model($params))->save()
  • 更多

这是否需要ModelFactory或是否可以复制代码?我该怎么做?

我知道这需要某种抽象;但究竟是哪个?

编辑:

我有一个Car模型和一个Driver模型,它们分别具有控制器和创建操作。但是,在RaceController#actionRegistration中,可以创建CarDriver。创建两个模型所需的过程不是vanilla Car#create()RaceController#actionRegister()中的创建过程是否需要我使用工厂模式?注意:我无法从RaceController#actionRegister()重定向到其他创建操作。我想在这里创建两个模型。

1 个答案:

答案 0 :(得分:1)

这回答了你的问题:我该怎么做?

在Factory模式中,简单工厂通常是静态声明的(如Larry Ullman的书中所述),但在Factory Method模式中,factoryMethod()方法被声明为可以被覆盖的抽象方法。原因是灵活性。

Factory Method Class Diagram

  1. 客户需要产品。
  2. 客户必须通过工厂方法请求产品。
  3. 记住这个OOP规则:一个班级应该只承担一个责任。
  4. 工厂类不得包含除创建对象之外的任何内容
  5. 在其余代码中,我们不需要直接创建对象,只能通过工厂
  6. 创建对象
  7. 在工厂中,可以使用静态方法,它将保存工厂对象的创建,但会阻止进一步继承类。
  8. 您的客户(即protected / views / products / index.php

    <?php
    include("../models/Pizza.php");
    include("../models/PizzaEurope.php");
    include("../models/PizzaItaly.php");
    
    include("Order.php");
    
    include("FactoryPizza.php");
    
    $order = new Order();
    $order->orderPizza('PizzaEurope');
    

    在您的控制器中:

    <?php
    class OrderController extends Controller {
      private $_pizza;
    
      public function orderPizza($type) {
        $pizza = new FactoryPizza();
        $this->_pizza = $pizza->create($type);
        echo $this->_pizza->getTitle(). ' - ' .$this->_pizza->getCost();
      }
    }
    

    在FactoryClass中:

    <?php 
      class FactoryPizza {
      public function create($type) {
        switch($type) {
            case 'PizzaEurope':
                $pizza = new PizzaEurope();
                break;
            case 'PizzaItaly':
                $pizza = new PizzaItaly();
                break;
        }
        return $pizza;
     }
    }
    

    这是一个简单的例子,我希望它能说明可能有用的设计模式概念。您可以找到另一个示例here