说明
这个设计模式属于创建型, 也是常用设计模式之一, 工厂模式分为: 简单工厂、工厂方法、静态工厂、抽象工厂
我们这篇主要介绍工厂方法模式, 工厂方法就是为了解决简单工厂扩展性的问题,相信大家再看简单工厂是也发现了其缺陷,以前简单工厂要扩展的时候,需要修改工厂内容,这就违背了设计模式对外扩展开放,对内修改关闭原则
- 应用场景
- 当你不知道该使用对象的确切类型的时候 客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。
- 当你希望为库或者框架提供扩展其内部组件的方法时
- 主要优点
- 解耦
- 符合原则
- 主要组成
- 抽象工厂接口
- 工厂接口的实现
- 抽象产品
- 具体产品
示例
- 多种数据库操作使用工厂方法实现
<?php
/**
* Created by 憧憬.
*/
/**
* 定义基础数据库操作
* Interface DataBase
*/
interface DataBase
{
function connect();
function first();
}
/**
* Mysql操作
* Class MySql
*/
class MySql implements DataBase
{
function connect()
{
return "MySQL连接对象返回";
}
function first()
{
return "MySQL返回查询结果";
}
}
/**
* pgsql操作
* Class PgSqlServer
*/
class PgSqlServer implements DataBase
{
function connect()
{
return "Pgsql连接对象返回";
}
function first()
{
return "Pgsql返回查询结果";
}
}
/**
* 声明工厂约束
* Interface FactoryDataBase
*/
interface FactoryDataBase{
function createDataBase();
}
/**
* mysql工厂实现
* Class MySqlFactory
*/
class MySqlFactory implements FactoryDataBase
{
public function createDataBase()
{
return new MySql();
}
}
/**
* pgsql工厂实现
* Class SqlServerFactory
*/
class SqlServerFactory implements FactoryDataBase
{
public function createDataBase()
{
return new PgSqlServer();
}
}
/**
* 这样做的话 对于增加新的连接没有任何影响,客户端无需感知, 例如我多增加一个oracle数据库的操作 使用者
* 不需要知道这个东西如何创建, 而我们只需要声明好接口即可
*/
$server = new MySqlFactory();
$db = $server->createDataBase();