簡體   English   中英

什么是實施工廠模式的正確方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM