设计模式 | 工厂方法模式

2020-07-20 17:12:19 浏览数 (1)

说明

这个设计模式属于创建型, 也是常用设计模式之一, 工厂模式分为: 简单工厂、工厂方法、静态工厂、抽象工厂

我们这篇主要介绍工厂方法模式, 工厂方法就是为了解决简单工厂扩展性的问题,相信大家再看简单工厂是也发现了其缺陷,以前简单工厂要扩展的时候,需要修改工厂内容,这就违背了设计模式对外扩展开放,对内修改关闭原则

  • 应用场景
  1. 当你不知道该使用对象的确切类型的时候 客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。
  2. 当你希望为库或者框架提供扩展其内部组件的方法时
  • 主要优点
  1. 解耦
  2. 符合原则
  • 主要组成
  1. 抽象工厂接口
  2. 工厂接口的实现
  3. 抽象产品
  4. 具体产品

示例

  • 多种数据库操作使用工厂方法实现
代码语言:javascript复制
<?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();

0 人点赞