一、概述
工厂模式是我们最常用的实例化对象模式,使用工厂模式代替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();