首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP中的工厂设计模式是什么?

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

Stack Overflow用户
提问于 2010-01-18 09:28:04
回答 8查看 55.5K关注 0票数 100

这让我很困惑,用最简单的术语来说,它是做什么的?假装你正在向你的母亲或其他人解释。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-01-18 09:37:35

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

代码语言:javascript
复制
 class A{
    public $classb;
    public $classc;
    public function __construct($classb, $classc)
    {
         $this->classb = $classb;
         $this->classc = $classc;
    }
  }

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

代码语言:javascript
复制
$obj = new ClassA(new ClassB, new Class C);

这就是工厂的用武之地。我们定义了一个工厂来为我们解决这个问题:

代码语言:javascript
复制
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;
    }
}

现在我们要做的就是

代码语言:javascript
复制
$factory = new Factory;
$obj     = $factory->build();

真正的好处是当你想要改变类的时候。假设我们想传入一个不同的ClassC:

代码语言:javascript
复制
class Factory_New extends Factory{
    public function buildC(){
        return new ClassD;
    }
}

或新的ClassB:

代码语言:javascript
复制
class Factory_New2 extends Factory{
    public function buildB(){
        return new ClassE;
    }
}

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

下面的user类就是一个很好的例子:

代码语言:javascript
复制
class User{
    public $data;
    public function __construct($data)
    {
        $this->data = $data;
    }
}

在这个类中,$data是我们用来存储数据的类。现在对于这个类,假设我们使用一个会话来存储我们的数据。工厂应该是这样的:

代码语言:javascript
复制
class Factory{
    public function build()
    {
        $data = $this->buildData();
        return $this->buildUser($data);
    }

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

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

现在,假设我们想要将所有数据存储在数据库中,更改它真的很简单:

代码语言:javascript
复制
class Factory_New extends Factory{
    public function buildData()
    {
        return DatabaseObject();
    }
}

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

票数 184
EN

Stack Overflow用户

发布于 2018-04-25 14:28:10

当您处理多个资源并希望实现高级抽象时,工厂设计模式非常好。

让我们把它分成不同的部分。

假设您必须实现抽象,并且您的类的用户不需要关心您在类定义中实现了什么。

他/她只需要担心你的类方法的使用。

例如,您的项目有两个数据库

代码语言:javascript
复制
class MySQLConn {

        public function __construct() {
                echo "MySQL Database Connection" . PHP_EOL;
        }

        public function select() {
                echo "Your mysql select query execute here" . PHP_EOL;
        }

}

class OracleConn {

        public function __construct() {
                echo "Oracle Database Connection" . PHP_EOL;
        }

        public function select() {
                echo "Your oracle select query execute here" . PHP_EOL;
        }

}

您的Factory类将负责为数据库连接创建对象。

代码语言:javascript
复制
class DBFactory {

        public static function getConn($dbtype) {

                switch($dbtype) {
                        case "MySQL":
                                $dbobj = new MySQLConn();
                                break;
                        case "Oracle":
                                $dbobj = new OracleConn();
                                break;
                        default:
                                $dbobj = new MySQLConn();
                                break;
                }

                return $dbobj;
        }

}

用户只需要传递数据库类型的名称

代码语言:javascript
复制
$dbconn1 = DBFactory::getConn("MySQL");
$dbconn1->select();

输出:

代码语言:javascript
复制
MySQL Database Connection
Your mysql select query execute here

将来你可能会有不同的数据库,然后你不需要改变整个代码,只需要传递新的数据库类型,其他代码就会运行,而不会做任何改变。

代码语言:javascript
复制
$dbconn2 = DBFactory::getConn("Oracle");
$dbconn2->select();

输出:

代码语言:javascript
复制
Oracle Database Connection
Your oracle select query execute here

希望这能有所帮助。

票数 21
EN

Stack Overflow用户

发布于 2010-01-18 09:31:28

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

想象一下这样的事情:

代码语言:javascript
复制
$joe = new Joe();
$joe->say('hello');

或工厂方法

代码语言:javascript
复制
Joe::Factory()->say('hello');

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

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

https://stackoverflow.com/questions/2083424

复制
相关文章

相似问题

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