说明
这个设计模式属于创建型, 也是常用设计模式之一, 工厂模式分为: 简单工厂、工厂方法、静态工厂、抽象工厂
我们这篇主要介绍工厂方法模式, 工厂方法就是为了解决简单工厂扩展性的问题,相信大家再看简单工厂是也发现了其缺陷,以前简单工厂要扩展的时候,需要修改工厂内容,这就违背了设计模式对外扩展开放,对内修改关闭原则
- 应用场景
- 当你不知道该使用对象的确切类型的时候 客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。
- 当你希望为库或者框架提供扩展其内部组件的方法时
- 主要优点
- 解耦
- 符合原则
- 主要组成
- 抽象工厂接口
- 工厂接口的实现
- 抽象产品
- 具体产品
示例
- 多种数据库操作使用工厂方法实现
<?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();