工廠模式

工廠模式

工廠方法模式,又稱工廠模式、多態工廠模式和虛擬構造器模式,通過定義工廠父類負責定義創建對象的公共接口,而子類則負責生成具體的對象
定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創建過程延遲到子類進行
應用場景:主要解決接口選擇的問題,我們明確地計劃不同條件下創建不同實例時;解決簡單工廠模式的缺點,之所以可以解決簡單工廠的問題,是因爲工廠方法模式把具體產品的創建推遲到工廠類的子類(具體工廠)中,此時工廠類不再負責所有產品的創建,而只是給出具體工廠必須實現的接口,這樣工廠方法模式在添加新產品的時候就不修改工廠類邏輯而是添加新的工廠子類,符合開放封閉原則,克服了簡單工廠模式中缺點
優點:更符合開-閉原則;符合單一職責原則;不使用靜態工廠方法,可以形成基於繼承的等級結構
缺點:添加新產品時,除了增加新產品類外,還要提供與之對應的具體工廠類,系統類的個數將成對增加,在一定程度上增加了系統的複雜度;同時,有更多的類需要編譯和運行,會給系統帶來一些額外的開銷;一個具體工廠只能創建一種具體產品
注意:作爲一種創建類模式,在任何需要生成複雜對象的地方,都可以使用工廠方法模式。有一點需要注意的地方就是複雜對象適合使用工廠模式,而簡單對象,特別是只需要通過 new 就可以完成創建的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統的複雜度

//抽象工廠
interface LoggerFactory
{
    public function createLogger();
}
//抽象產品
interface Logger
{
    public function log($message);
}
//具體工廠類
class StdoutLoggerFactory implements LoggerFactory
{
    public function createLogger()
    {
        return new StdoutLogger();
    }
}
class FileLoggerFactory implements LoggerFactory
{
    private $filePath;
    public function __construct(string $filePath)
    {
        $this->filePath = $filePath;
    }
    public function createLogger()
    {
        return new FileLogger($this->filePath);
    }
}
//具體產品類
class StdoutLogger implements Logger
{
    public function log($message)
    {
        echo $message;
    }
}
class FileLogger implements Logger
{
    private $filePath;
    public function __construct($filePath)
    {
        $this->filePath = $filePath;
    }
    public function log($message)
    {
        file_put_contents($this->filePath, $message . PHP_EOL, FILE_APPEND);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章