不,這不是一個真正的工廠模式。工廠模式會看起來更象這樣:
<?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
{
}
雖然我會使用像'\來源\格式靜態函數::創建($格式)',你的代碼看起來不錯。那有什麼不對? – hek2mgl 2013-02-08 21:27:56
這是一個反模式:long switch-statement和一個知道它的所有子類的父類 – 2013-02-08 21:28:03
@fab這不是一個通用工廠,但它是可以的。我看到沒有'反模式' – hek2mgl 2013-02-08 21:29:13