PHP – 工厂模式

一、概述

工厂模式是我们最常用的实例化对象模式,使用工厂模式代替new的一种模式。

根据抽象程度不同,PHP工厂模式分为三种:

1、简单工厂模式

2、工厂方法模式

3、抽象工厂模式

二、简单工厂模式

<?php
declare(strict_types = 1);

interface DataBase
{
    public function conn();
}

class Mysql implements DataBase
{
    public function conn()
    {
        return '这里是Mysql连接,已经连接';
    }
}

class Oracle implements DataBase
{
    public function conn()
    {
        return '这里是Oracle连接,已经连接';
    }
}

class DataBaseFactory
{
    const MYSQL = 1; // Mysql
    const ORACLE = 2; // Oracle

    public static function getDataBase(int $type)
    {
        switch ($type) {
            case self::MYSQL:
                return new Mysql();
                break;
            case self::ORACLE:
                return new Oracle();
                break;
            default:
                break;
        }
    }
}

echo DataBaseFactory::getDataBase(1)->conn();
echo DataBaseFactory::getDataBase(2)->conn();

三、工厂方法模式

简单工厂模式虽然实现了工厂封装,但如果这时添加了一个需求,要一个 SqlLite 连接,这时,必然又得修改已经封装好的代码,违反了面向对象编程中的开闭原则(对于修改是关闭的,对于扩展是开放的),因此工厂方法诞生。

<?php
declare(strict_types = 1);

/**
 * 实现数据库工厂类接口
 * Interface DataBase
 */
interface DataBase
{
    public function conn();
}

class MySql implements DataBase
{
    public function conn()
    {
        return '这里是Mysql连接,已经连接';
    }
}

class Oracle implements DataBase
{
    public function conn()
    {
        return '这里是Oracle连接,已经连接';
    }
}

/**
 * 创建数据库工厂类接口
 * Interface DataBaseFactory
 */
interface DataBaseFactory
{
    public static function createDataBase();
}

class MySqlFactory implements DataBaseFactory
{
    public static function createDataBase()
    {
        return new MySql();
    }
}

class OracleFactory implements DataBaseFactory
{
    public static function createDataBase()
    {
        return new Oracle();
    }
}

echo MySqlFactory::createDataBase()->conn();
echo OracleFactory::createDataBase()->conn();

// 这时,如果添加了sqlLite连接的需求,不用修改原代码,只需要扩展新代码即可
/*
class SqlLiteFactory implements DataBaseFactory
{
    public static function createDataBase()
    {
        return new SqlLite();
    }
}

class SqlLite
{
    public function conn()
    {
        return '这里是SqlLite连接,已经连接';
    }
}
*/
//echo SqlLiteFactory::createDataBase()->conn();