[英]What is the right way to implement factory pattern?
我只是想知道這是否是在PHP中創建對象和實現工廠模式的正確方法。 我知道我們有工廠方法模式和抽象工廠模式,但是是否有類似以下http://noondreams.com/shared/data/pages/images/Factory.png的模式?
class Factory
{
public function make($format)
{
switch($format)
{
case Source::Assocs:
return new \Source\Formats\Assocs();
case Source::XML
return new \Source\Formats\XML();
//Some other formats
}
}
}
不,這實際上不是工廠模式。 工廠模式看起來像這樣:
<?php
abstract class File
{
public static function createFromFile($filename)
{
$extension = /* get file extension */;
switch ($extension)
{
case 'xml':
return new XmlFile($filename);
break;
case 'php':
return new PhpFile($filename);
break;
}
throw new \InvalidArgumentException();
}
}
class XmlFile extends File
{
}
class PhpFile extends File
{
}
請注意,抽象類是如何創建具體類的實例的,這些實例可以對其進行擴展,而用戶不必擔心它可能返回的各種類型。
注意 :在實際情況下,您不會使用switch語句,但是可能會使用反射或其他各種技術,因為抽象類不會知道所有的子類。
可能看起來像這樣:
<?php
abstract class File
{
public static function createFromFile($filename)
{
$extension = /* get file extension */;
$extension = ucfirst($extension);
$reflection = new ReflectionClass($extension . 'File');
return $reflection->newInstanceArgs(array($filename));
}
}
class XmlFile extends File
{
}
class PhpFile extends File
{
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.