天天看點

PHP設計模式——工廠方法模式(研磨設計模式學習筆記)

定義:     定義一個用于建立對象的接口,讓子類決定執行個體化哪一個類, Factory Method 使一個類的執行個體化延遲到子類。 工廠方法的解決思路很有意思,就是不解決,采取無為而治的方式。

功能:讓父類不知道的情況下,完成自身的功能調用;而具體的實作延遲到子類來實作 。

實作成抽象類 實作成具體類 工廠方法的參數和傳回 誰在使用工廠方法建立對象:     應該是Creator的其他方法在使用工廠方法建立的對象,雖然也可以其建立的對象提供給外部,但工廠方法模式的本意是由Creator對象内部的方法來使用工廠方法建立的對象。     也就是說,工廠方法一般不提供給Creator外部使用。     1.用戶端使用Creator對象的情況

        abstract class Creator {             abstract function facotryMethod();

            public function someOpreration() {                 //這裡使用工廠方法

                $p = $this-> facotryMethod();             }

        }

    2. 用戶端使用Creator建立出來的對象

    小結:該模式裡面,用戶端要麼使用Creator對象,要麼使用Creator建立的對象,一般用戶端不直接使用工廠方法。當然了可以暴露,但一般不這麼做。

例子:         

interface ExportFileApi {
	public function export($data);
}

class ExportTextFile implements ExportFileApi {
	
	public function export($data) {
		
	}
}

class ExportDbtFile implements ExportFileApi {
	
	public function export($data) {
		
	}
}

abstract class ExportOperate {
	
	function export($data) {
		$api = $this->factoryMethod();
		$api->exprot($data);
	}
	
	abstract function factoryMethod();
}

class ExportTxtFileOprate extends ExportOperate {
	function factoryMethod() {
		return new ExportTxtFile();
	}
}

class ExportDBOprate extends ExportOperate {
	function factoryMethod() {
		return new ExportDbFile();
	}
}


class Client {
	public static function main() {
		$operate = new ExportDBOprate;
		$operate->export('測試資料');
	}
}
           

工廠方法與IoC/DI ioc 控制反轉 DI  依賴注入

工廠方法模式和 IOC/DI 的思想是一樣的,都是主動變被動,進行了主從換位。進而獲得了靈活的程式結構;

優點:     1.可在不知情的情況下程式設計

    2.更容易擴充對象的新版本

    3.連接配接平行的類層次

缺點:     增加了耦合性

如下情況可以選用工廠方法: 1. 在一個類需要建立某個接口的對象,但是又不知道具體的實作,把建立對象的工作延遲到子類去。 2. 如果一個類本身就是希望由它的子類來建立所需的對象的時候。