这让我很困惑,用最简单的术语来说,它是做什么的?假装你正在向你的母亲或其他人解释。
发布于 2010-01-18 09:37:35
工厂创建一个对象。所以,如果你想构建
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;
}
}
现在我们可以使用继承来轻松地修改类的创建方式,以放入一组不同的类中。
下面的user类就是一个很好的例子:
class User{
public $data;
public function __construct($data)
{
$this->data = $data;
}
}
在这个类中,$data
是我们用来存储数据的类。现在对于这个类,假设我们使用一个会话来存储我们的数据。工厂应该是这样的:
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();
}
}
工厂是我们用来控制如何将对象放在一起的设计模式,使用正确的工厂模式允许我们创建所需的自定义对象。
发布于 2018-04-25 14:28:10
当您处理多个资源并希望实现高级抽象时,工厂设计模式非常好。
让我们把它分成不同的部分。
假设您必须实现抽象,并且您的类的用户不需要关心您在类定义中实现了什么。
他/她只需要担心你的类方法的使用。
例如,您的项目有两个数据库
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类将负责为数据库连接创建对象。
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;
}
}
用户只需要传递数据库类型的名称
$dbconn1 = DBFactory::getConn("MySQL");
$dbconn1->select();
输出:
MySQL Database Connection
Your mysql select query execute here
将来你可能会有不同的数据库,然后你不需要改变整个代码,只需要传递新的数据库类型,其他代码就会运行,而不会做任何改变。
$dbconn2 = DBFactory::getConn("Oracle");
$dbconn2->select();
输出:
Oracle Database Connection
Your oracle select query execute here
希望这能有所帮助。
发布于 2010-01-18 09:31:28
就像现实生活中的工厂一样,它创建一些东西并返回它。
想象一下这样的事情:
$joe = new Joe();
$joe->say('hello');
或工厂方法
Joe::Factory()->say('hello');
工厂方法的实现将创建一个新实例并返回它。
https://stackoverflow.com/questions/2083424
复制相似问题