1. 程式人生 > 其它 >PHP 設計模式系列 —— 簡單工廠模式、工廠方法模式、抽象工廠模式

PHP 設計模式系列 —— 簡單工廠模式、工廠方法模式、抽象工廠模式

技術標籤:PHP 設計模式

1、簡單工廠模式

定義:定義一個工廠類,他可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類
在簡單工廠模式中用於被建立例項的方法通常為靜態(static)方法,因此簡單工廠模式又被成為靜態工廠方法

需要什麼,只需要傳入一個正確的引數,就可以獲取所需要的物件,而無需知道其實現過程

缺點:
系統擴充套件困難,一旦新增新產品就不得不修改工廠邏輯,同樣破壞了“開閉原則”;在產品型別較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴充套件和維護。

適用環境:
工廠類負責建立的物件比較少:由於建立的物件較少,不會造成工廠方法中的業務邏輯太過複雜。
呼叫者需要傳入工廠類的引數,對於如何建立物件不關心:呼叫者既不需要關心建立細節,甚至連類名都不需要記住,只需要知道型別所對應的引數。

示例程式碼

1、定義interface,手機有打電話和發簡訊的功能
AbstractMobile.php

<?php

interface AbstractMobile
{
    /**
     * 打電話
     * @return mixed
     */
    public function call();

    /**
     * 發簡訊
     * @return mixed
     */
    public function send();
}

MobileIPhone.php

<?php

/**
 * 蘋果手機
 * Class MobileIPhone
 */
require_once __DIR__ . '/AbstractMobile.php'; class MobileIPhone implements AbstractMobile { public function call() { // TODO: Implement call() method. echo "IPhone: call" . "<br/>"; } public function send() { // TODO: Implement send() method.
echo "IPhone: send" . "<br/>"; } }

MobileHuawei.php

<?php

/**
 * 華為手機
 * Class MobileIPhone
 */

require_once __DIR__ . '/AbstractMobile.php';

class MobileHuawei implements AbstractMobile
{

    public function call()
    {
        // TODO: Implement call() method.
        echo "Huawei: call" . "<br/>";
    }

    public function send()
    {
        // TODO: Implement send() method.
        echo "Huawei: send" . "<br/>";
    }

}

MobileXiaomi.php

<?php

/**
 * 小米手機
 * Class MobileIPhone
 */
require_once __DIR__ . '/AbstractMobile.php';

class MobileXiaomi implements AbstractMobile
{

    public function call()
    {
        // TODO: Implement call() method.
        echo "Xiaomi: call" . "<br/>";
    }

    public function send()
    {
        // TODO: Implement send() method.
        echo "Xiaomi: send" . "<br/>";
    }

}

通過工廠類 Factory.php 去呼叫

<?php

/**
 * 工廠類
 * Class Factory
 */
class Factory
{
    private static $instance;

    public static function create($name)
    {
        $class = null;
        switch ($name) {
            case '1':
                require_once __DIR__ . '/MobileIPhone.php';
                self::$instance = new MobileIPhone();
                break;
            case '2':
                require_once __DIR__ . '/MobileHuawei.php';
                self::$instance = new MobileHuawei();
                break;
            case '3':
                require_once __DIR__ . '/MobileXiaomi.php';
                self::$instance = new MobileXiaomi();
                break;
            default:
                echo "類 {$name} 不存在";
                exit;
                break;
        }
        return self::$instance;
    }
}

例項化工廠類,生成不同的物件,不需要知道手機的實現細節

<?php

// 呼叫工廠

require_once __DIR__ . '/Factoty.php';


ini_set('display_errors', 1);
error_reporting(E_ALL);

// 蘋果手機
$instance = Factory::create('1');
$instance->call();
$instance->send();

echo "<br/>";

// 華為手機
$instance = Factory::create('2');
$instance->call();
$instance->send();

echo "<br/>";

// 小米手機
$instance = Factory::create('3');
$instance->call();
$instance->send();

2、工廠方法模式

定義一個建立物件的介面,讓子類決定哪個類例項化。 他可以解決簡單工廠模式中的封閉開放原則問題。

程式碼示例:
沿用簡單工廠模式中的
AbstractFactory.php
MobileIPhone.php
MobileHuawei.php
MobileXiaomi.php

新增類:
AbstractFactory.php

<?php

/**
 * 工廠類
 * Class Factory
 */
interface AbstractFactory
{
    public function create();
}

FactoryIPhone.php

<?php
require_once __DIR__ . '/AbstractFactory.php';

class FactoryIPhone implements AbstractFactory
{
    public function create()
    {
        // TODO: Implement create() method.
        echo "FactoryIPhone: create" . "<br/>";
        require_once __DIR__ . '/MobileIPhone.php';
        return new MobileIPhone();
    }
}

FactoryHuawei.php

<?php
require_once __DIR__ . '/AbstractFactory.php';

class FactoryHuawei implements AbstractFactory
{
    public function create()
    {
        // TODO: Implement create() method.
        echo "FactoryHuawei: create" . "<br/>";
        require_once __DIR__ . '/MobileHuawei.php';
        return new MobileHuawei();
    }
}

FactoryXiaomi.php

<?php
require_once __DIR__ . '/AbstractFactory.php';

class FactoryXiaomi implements AbstractFactory
{
    public function create()
    {
        // TODO: Implement create() method.
        echo "FactoryXiaomi: create" . "<br/>";
        require_once __DIR__ . '/MobileXiaomi.php';
        return new MobileXiaomi();
    }
}

呼叫:

<?php

// 呼叫工廠


ini_set('display_errors', 1);
error_reporting(E_ALL);

require_once __DIR__ . '/FactoryIPhone.php';
require_once __DIR__ . '/FactoryHuawei.php';
require_once __DIR__ . '/FactoryXiaomi.php';


// 蘋果手機
$factory = new FactoryIPhone();
$instance = $factory->create();
$instance->call();
$instance->send();

echo "<br/>";

// 華為手機
$factory = new FactoryHuawei();
$instance = $factory->create();
$instance->call();
$instance->send();


echo "<br/>";

// 小米手機
$factory = new FactoryXiaomi();
$instance = $factory->create();
$instance->call();
$instance->send();

抽象工廠模式

抽象工廠模式是圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠