Factory 工廠模式-極簡範例

首先建立一個抽象工廠類別,其中有一個抽象方法factoryMethod()和一個已撰寫好程式碼的startFactory()方法,所有繼承Creator類的工廠類別,只要執行公用的startFactory()方法,就會返回該類自已的factoryMethod()方法結果。

//工廠抽象類別
abstract class Creator
{
    protected abstract function factoryMethod();
    
    public function startFactory()
    {
        $mfg = $this->factoryMethod();
        return $mfg;
    }
}

建立 2 個工廠,都是繼承自 Creator 類別

//Car工廠
class CarFactory extends Creator
{
    protected function factoryMethod()
    {
        $product = new CarProduct();
        return $product->make();
    }
}

//Jet工廠
class JetFactory extends Creator
{
    protected function factoryMethod()
    {
        $product = new JetProduct();
        return $product->make();
    }
}

建立一個產品介面,裡面有一個 make() 方法,所有 implements 該介面的類都要實作這個方法

//產品公用介面
interface IProduct
{
    public function make();
}

建立 2 個產品類別,都是 implements IProduct介面,所以要實作該介面方法 make(),這是屬於產品內容的描述方法

//產品Car
class CarProduct implements IProduct
{
    private $mfgProduct;
    
    public function make()
    {
        $this->mfgProduct = "This is a Car.<br />";
        return $this->mfgProduct;
    }
}

//產品Jet
class JetProduct implements IProduct
{
    private $mfgProduct;
    
    public function make()
    {
        $this->mfgProduct = "This is a Jet.<br />";
        return $this->mfgProduct;
    }
}

建立一個用戶類別,實例化 Car 和 Jet 工廠,並執行該類別的 startFactory() 抽象公用方法

//用戶端
class Client
{
    private $someCarObject;
    private $someJetObject;
    
    public function __construct()
    {
        $this->someCarObject = new CarFactory();
        echo $this->someCarObject->startFactory();
        
        $this->someJetObject = new JetFactory();
        echo $this->someJetObject->startFactory();
    }
}

$worker = new Client();

Browser結果
This is a Car.
This is a Jet.