PHP 设计模式系列 —— 简单工厂模式、工厂方法模式、抽象工厂模式

1、简单工厂模式

简单工厂模式的定义:一个类可以根据不同的参数来获取不同的实例,一般这些被创建的实例都具有相同的父类。
静态工厂模式:一般的,我们将简单工厂模式中的用于创建不同实例的方法设置为静态方法,避免创建多个相同实例。

在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法

示例代码

1、定义interface,手机有打电话和拍照的功能
InterfaceMobile.php

<?php

interface InterfaceMobile
{
    /**
     * 打电话
     * @return mixed
     */
    public function call();

    /**
     * 拍照
     * @return mixed
     */
    public function photograph();
}

MobileIPhone.php

<?php

/**
 * 苹果手机
 * Class MobileIPhone
 */
require_once __DIR__ . '/InterfaceMobile.php';

class MobileIPhone implements InterfaceMobile
{

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

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

}

MobileHuawei.php

<?php

/**
 * 华为手机
 * Class MobileIPhone
 */

require_once __DIR__ . '/InterfaceMobile.php';

class MobileHuawei implements InterfaceMobile
{

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

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

}

MobileXiaomi.php

<?php

/**
 * 小米手机
 * Class MobileIPhone
 */
require_once __DIR__ . '/InterfaceMobile.php';

class MobileXiaomi implements InterfaceMobile
{

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

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

}

通过工厂类 Factory.php 去调用

<?php

/**
 * 工厂类
 * Class Factory
 */
class Factory
{
    private static $instance;

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

实例化工厂类,生成不同的对象,不需要知道手机的实现细节

<?php

// 调用工厂

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

require_once __DIR__ . '/Factoty.php';

$mobile_name = 'IPhone';

$instance = Factory::create($mobile_name);// 只需传入需要创建的手机类型即可,不需要知道细节: IPhone | Huawei | Xiaomi
$instance->call();
$instance->photograph();

缺点:
系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,同样破坏了“开闭原则”;在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

2、工厂方法模式

定义一个创建对象的接口,让子类决定哪个类实例化。 他可以解决简单工厂模式中的封闭开放原则问题。

代码示例:
沿用简单工厂模式中的
InterfaceMobile.php
MobileIPhone.php
MobileHuawei.php
MobileXiaomi.php

新增接口类:
InterfaceFactory.php

<?php

/**
 * 工厂类
 * Class Factory
 */
interface InterfaceFactory
{
    public function create();
}

FactoryIPhone.php

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

class FactoryIPhone implements InterfaceFactory
{
    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__ . '/InterfaceFactory.php';

class FactoryHuawei implements InterfaceFactory
{
    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__ . '/InterfaceFactory.php';

class FactoryXiaomi implements InterfaceFactory
{
    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';

$mobile_name = 'IPhone';

if ($mobile_name == 'IPhone') {
    // 苹果手机
    $factory = new FactoryIPhone();
} elseif ($mobile_name == 'Huawei') {
    // 华为手机
    $factory = new FactoryHuawei();
} elseif ($mobile_name == 'Huawei') {
    // 小米手机
    $factory = new FactoryXiaomi();
}

$instance = $factory->create();
$instance->call();
$instance->photograph();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值