溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP抽象工廠模式的優(yōu)點(diǎn)與實(shí)現(xiàn)方法是什么

發(fā)布時(shí)間:2023-03-27 10:45:42 來源:億速云 閱讀:71 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“PHP抽象工廠模式的優(yōu)點(diǎn)與實(shí)現(xiàn)方法是什么”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

    抽象工廠模式Abstract Factory Pattern是什么

    抽象工廠模式是一種創(chuàng)建型模式,它提供了一種創(chuàng)建一系列相關(guān)或相互依賴對象的最佳方式。在抽象工廠模式中,我們定義一個(gè)抽象工廠接口,由具體的工廠類來實(shí)現(xiàn)該接口,創(chuàng)建一系列相關(guān)的對象。

    抽象工廠模式的優(yōu)點(diǎn)

    • 抽象工廠模式可以幫助我們實(shí)現(xiàn)松耦合,客戶端代碼無需知道實(shí)際創(chuàng)建的對象,只需知道抽象工廠即可;

    • 抽象工廠模式可以幫助我們封裝變化,客戶端代碼無需關(guān)心具體對象的創(chuàng)建過程,只需關(guān)心抽象工廠即可;

    • 抽象工廠模式可以幫助我們實(shí)現(xiàn)單一職責(zé)原則,一個(gè)類只負(fù)責(zé)一個(gè)職責(zé),由工廠類負(fù)責(zé)創(chuàng)建對象。

    抽象工廠模式的實(shí)現(xiàn)

    在 PHP 中,我們可以使用以下方式來實(shí)現(xiàn)抽象工廠模式:

    1. 定義抽象產(chǎn)品類

    <?php
    // 定義抽象產(chǎn)品類(汽車)
    abstract class Car
    {
        protected $brand;
        protected $type;
        public function __construct($brand, $type)
        {
            $this->brand = $brand;
            $this->type = $type;
        }
        abstract public function run();
    }
    // 定義抽象產(chǎn)品類(手機(jī))
    abstract class Phone
    {
        protected $brand;
        protected $model;
        public function __construct($brand, $model)
        {
            $this->brand = $brand;
            $this->model = $model;
        }
        abstract public function call();
    }

    2. 定義具體產(chǎn)品類

    <?php
    // 定義具體產(chǎn)品類(奔馳汽車)
    class BenzCar extends Car
    {
        public function run()
        {
            echo "{$this->brand} {$this->type} is running..." . PHP_EOL;
        }
    }
    // 定義具體產(chǎn)品類(寶馬汽車)
    class BmwCar extends Car
    {
        public function run()
        {
            echo "{$this->brand} {$this->type} is running..." . PHP_EOL;
        }
    }
    // 定義具體產(chǎn)品類(蘋果手機(jī))
    class ApplePhone extends Phone
    {
        public function call()
        {
            echo "{$this->brand} {$this->model} is calling..." . PHP_EOL;
        }
    }
    // 定義具體產(chǎn)品類(華為手機(jī))
    class HuaweiPhone extends Phone
    {
        public function call()
        {
            echo "{$this->brand} {$this->model} is calling..." . PHP_EOL;
        }
    }

    3. 定義抽象工廠類

    <?php
    // 定義抽象工廠類
    abstract class AbstractFactory
    {
        abstract public function createCar($type);
        abstract public function createPhone($model);
    }

    4. 定義具體工廠類

    <?php
    // 定義具體工廠類(德國工廠)
    class GermanFactory extends AbstractFactory
    {
        public function createCar($type)
        {
            switch ($type) {
                case 'Benz':
                    return new BenzCar('Benz', 'C200L');
                case 'Bmw':
                    return new BmwCar('Bmw', 'X3');
                default:
                    throw new Exception('Undefined car type.');
            }
        }
        public function createPhone($model)
        {
            switch ($model) {
                case 'iPhone':
                    return new ApplePhone('Apple', 'iPhone 11');
                case 'Huawei':
                    return new HuaweiPhone('Huawei', 'Mate 30');
                default:
                    throw new Exception('Undefined phone model.');
            }
        }
    }
    // 定義具體工廠類(中國工廠)
    class ChineseFactory extends AbstractFactory
    {
        public function createCar($type)
        {
            switch ($type) {
                case 'Benz':
                    return new BenzCar('奔馳', 'C200L');
                case 'Bmw':
                    return new BmwCar('寶馬', 'X3');
                default:
                    throw new Exception('Undefined car type.');
            }
        }
        public function createPhone($model)
        {
            switch ($model) {
                case 'iPhone':
                    return new ApplePhone('蘋果', 'iPhone 11');
                case 'Huawei':
                    return new HuaweiPhone('華為', 'Mate 30');
                default:
                    throw new Exception('Undefined phone model.');
            }
        }
    }

    5. 使用

    <?php
    // 使用德國工廠
    $germanFactory = new GermanFactory();
    $car1 = $germanFactory->createCar('Benz');
    $car1->run(); // output: Benz C200L is running...
    $phone1 = $germanFactory->createPhone('iPhone');
    $phone1->call(); // output: Apple iPhone 11 is calling...
    // 使用中國工廠
    $chineseFactory = new ChineseFactory();
    $car2 = $chineseFactory->createCar('Bmw');
    $car2->run(); // output: 寶馬 X3 is running...
    $phone2 = $chineseFactory->createPhone('Huawei');
    $phone2->call(); // output: 華為 Mate 30 is calling...

    “PHP抽象工廠模式的優(yōu)點(diǎn)與實(shí)現(xiàn)方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    php
    AI