【问题标题】:How to apply factory pattern php如何应用工厂模式php
【发布时间】:2013-04-26 21:36:59
【问题描述】:

我不确定如何应用工厂模式。

如果我以这段代码为例:

class Car
{
    protected $_engine;
    protected $_frame;
    protected $_wheels;

    public function __construct($engine,$frame,$wheels)
    {
        $this->_engine = $engine;
        $this->_frame = $frame;
        $this->_wheels = $wheels;
    }
}

class Engine
{
    protected $_hp;

    public function __construct($hp)
    {
        $this->_hp = $hp;
    }
}

class Frame
{
    protected $_type;
    protected $_length;

    public function __construct($type,$length)
    {
        $this->_type = $type;
        $this->_length = $length;
    }
}

class Wheels
{
    protected $_diameter;

    public function __construct($diameter)
    {
        $this->_diameter = $diameter;
    }
}

class CarFactory
{
    // ???
}

工厂应该如何制造汽车的所有部件?每个零件都需要工厂吗?如果是这样,CarFactory 是如何知道它们的? IOC、DI 和工厂模式的结合让我感到困惑,应该在哪里启动任何事情或任何事情。我看到了它们的所有好处(我认为)。

依赖注入如何在这里发挥作用?每个部分都可以是它自己的对象,但为了简单起见,我暂时省略了它。

希望我的问题足够清楚。

提前致谢!

【问题讨论】:

    标签: php oop dependency-injection factory-pattern


    【解决方案1】:

    如果你有不同类型的汽车,你需要使用工厂。

    class Car
    {
        protected $type;
    
        public function drive()
        {
            echo 'Zoom-zoom!';
        }
    
        public static function factory($driven)
        {
            $instance = null;
            switch ($driven) {
                case 2:
                    $instance = new Sedan;
                    break;
                case 4:
                    $instance = new Crossover;
                    break;
                default:
                    throw new Exception('Invalid driven type: ' . $driven);
            }
    
            return $instance;
        }
    }
    
    class Sedan extends Car
    {
        // some things for sedan
    }
    
    class Crossover extends Car
    {
        // some things for Crossover
    }
    
    $sedan = Car::factory(2);
    $crossover = Car::factory(4);
    
    $sedan->drive();
    $crossover->drive();
    

    类似的东西。

    【讨论】:

    • 当然你可以在工厂中使用任意参数。所以你也可以在那里添加 DI 并在新实例中注入依赖项。
    • 如何将它与 DI 一起使用?加上额外的零件等。
    • public static function factory($type, $power, $doors) { //... $instance = new Sedan($power, $doors); //... } 甚至public static function factory() { $type = func_get_arg(0); //the first argument //... $instance = new Sedan(func_get_args()); //... } 换句话说,你只需注入你输入的内容。我想我宁愿在几分钟内添加一个带有示例的要点......
    • 但是我在哪里创建额外的部分对象?
    • 你的意思是如何注入它们或什么?您需要在调用工厂时准备好它们,或者实现容器之类的东西,它允许您从存储中检索对象。然后,例如,您可以只传递容器,而不是传递对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多