题
这让我很困惑,用最简单的术语来说,它有什么作用?假装你正在向你的母亲或其他人解释。
解决方案
一个工厂创建的对象。所以,如果你想建立
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
是我们用来存储我们的数据的类。现在对于这个类,可以说,我们使用一个会话来存储我们的数据。工厂是这样的:
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');
工厂方法的实施将创建一个新实例并返回它。
工厂设计模式是当你正在处理多个资源和要实现高层次的抽象非常好。
让我们打入不同部分这一点。
假设你有实现的抽象和类的用户并不需要关心你的类定义来实现的。
他/她只是需要担心使用你的类的方法。
e.g。你有两个数据库,为您的项目
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;
}
}
您的工厂类会照顾创建对象的数据库连接。
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
希望这会有所帮助。
在一般“工厂”制造物品:在对象的定向编程的情况下,一个“工厂设计模式”产生的对象
如果它在PHP,C#或其他任何对象为导向的语言并不重要。
工厂设计模式(工厂模式)可以松散耦合。像工厂,数据的含义为出厂时(产生数据)到最终用户。通过这种方式,在工厂打破数据的源和处理数据之间的紧密耦合。
此答案是相对于其它交其中丹尼尔White表示使用工厂使用工厂模式创建MySQL连接。
有关MySQL连接我宁愿为你想使用相同的连接使用Singleton模式 用于访问数据库不创建另一个。
的经典方法实例化对象是:
$Object=new ClassName();
PHP必须使用以下语法动态创建从变量名对象的能力:
$Object=new $classname;
其中变量$类名包含类之一的名称想要实例
所以经典对象保理会是什么样子:
function getInstance($classname)
{
if($classname==='Customer')
{
$Object=new Customer();
}
elseif($classname==='Product')
{
$Object=new Product();
}
return $Object;
}
如果你调用的getInstance(“产品”)函数这个工厂将创建并返回Product对象。否则,如果你调用的getInstance(“客户”)函数这个工厂将创建并返回客户对象类型(从客户()创建的类)。
有没有需要的任何更多,可以发送“产品”或“客户”(现有类的确切名称)作为用于动态实例化变量的值:
$classname='Product';
$Object1=new $classname; //this will instantiate new Product()
$classname='Customer';
$Object2=new $classname; //this will instantiate new Customer()
郑重声明,简单来说,像 @Pindatjuh 所说的工厂会返回一个对象。
那么,与构造函数有什么区别?(作用相同)
- 构造函数使用他自己的实例。
- 我想要一些更高级的东西,并且我不想使对象膨胀(或添加依赖项)。
创建每个实例时都会调用构造函数。有时你不希望那样。
例如,假设每次我创建 Account 类的对象时,我都会从数据库中读取一个文件并将其用作模板。
使用构造函数:
class Account {
var $user;
var $pwd;
var ...
public __construct() {
// here i read from the file
// and many other stuff
}
}
使用工厂:
class Account {
var $user;
var $pwd;
var ...
}
class AccountFactory {
public static Create() {
$obj=new Account();
// here we read the file and more stuff.
return $obj;
}