摘要:主要是参考列旭松、陈文著的《PHP核心技术与最佳实践》的2.1节。

1.1 简介

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。工厂模式(Factory)允许你在代码执行时实例化对象。之所以被称为工厂模式是因为它只负责‘生产’对象。以数据库为例,工厂需要的是根据不同的参数,生产不同的实例化对象。最简单的工厂模式就是根据传入的类型名实例化对象,比如传入Mysql,就调用Mysql的类并实例化,比如传入SQLite,则调用SQLite的类并实例化,甚至可以处理TXT、EXCEL等‘类数据库’。工厂类就是这样的类,只负责生产对象,而不负责对象的具体内容。
工厂方法让具体的对象解脱了出来,使其并不再依赖具体的类,而是抽象。

1.2 优点

工厂模式的优点在于创建对象上。建立一个工厂(一个函数或一个类方法)来制造新的对象,它的任务就是把对象的创建过程都封装起来,创建对象不是使用new的形式了。而是定义一个方法,用于创建对象实例。

通俗的说,以前创建一个对象要使用new,现在把这个过程封装起来了。
假设不使用工厂模式:那么很多地方调用类a,代码就会这样子创建一个实例:new a(),假设某天需要把a类的名称修改,意味着很多调用的代码都要修改。

1.3 简单的工厂模式例子

代码是参考百度百科的:

https://baike.baidu.com/item/%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/9852061?fr=aladdin

1
<?php

2
    interface abstracted

3
    {

4
        public function realCreate();

5
    }

6
7
    //女人类

8
    class Woman

9
    {

10
        public function action()

11
        {

12
            echo '这是女人';

13
        }

14
    }

15
16
    //男人类

17
    class Man

18
    {

19
        public function action()

20
        {

21
            echo '这是男人';

22
        }

23
    }

24
25
    //创建女人

26
    class WomanCreator implements abstracted 

27
    {

28
        public $chromosome;//染色体

29
        public function realCreate(){

30
            if ($this->chromosome == "xx") {

31
                return new Woman();

32
            }

33
        }

34
    }

35
36
    //创建男人

37
    class ManCreator implements abstracted 

38
    {

39
        public $chromosome;

40
        public function realCreate()

41
        {

42
            if ($this->chromosome == "xy" || $this->chromosome == "xyy") {

43
                return new Man();

44
            }

45
        }

46
    }

47
48
    //人类工厂

49
    class PersonFactory

50
    {

51
        public function create($what){

52
            $create = $what."Creator";

53
            return $create = new $create();

54
        }

55
    }

56
57
    $create = new PersonFactory();

58
    $instance = $create->create('Woman');

59
    $instance->chromosome = "xx";

60
    $instance->realCreate()->action();

1.4 数据库适配器

使用工厂模式定义数据库适配器,根据不同的数据库参数实例化不同的数据库类。
定义一个数据库适配器接口,规定一些通用的方法:
2_Drivers\Db_Adapter.php:
<?php
/*** Db的适配器*/interface Db_Adapter
{/*** 数据库连接* @param array $config 数据库配置* @return resource*/public function connect($config);/*** 执行数据库查询* @param string $query 数据库查询SQL字符串* @return resource*/public function query($query);
}

定义一个Mysql数据库的操作类(简化版),实现了数据库适配器接口:
2_Drivers\Db_Adapter_Mysqli.php:
1
<?php

2
/**

3
 * 定义MySql数据库的操作类

4
 */

5
6
require_once 'Db_Adapter.php';

7
8
class Db_Adapter_Mysqli implements Db_Adapter

9
{

10
    // 数据库连接字符串标示

11
    private $_dbLink;

12
13
    /**

14
     * 数据库连接函数

15
     * @param array $config 数据库配置

16
     * @return mysqli

17
     */

18
    public function connect($config)

19
    {

20
        $this->_dbLink = @mysqli_connect($config['host'] . (empty($config['port']) ? '' : ':' . $config['port']), $config['user'], $config['password']);

21
        if ($this->_dbLink) {

22
            if (@mysqli_select_db($this->_dbLink, $config['database'])) {

23
                if (isset($config['charset'])) {

24
                    mysqli_query($this->_dbLink, "SET NAMES '{$config['charset']}'");

25
                }

26
                return $this->_dbLink;

27
            }

28
        }

29
30
        // 数据库异常

31
        throw new mysqli_sql_exception(@mysqli_error($this->_dbLink));

32
    }

33
34
    /**

35
     * 执行数据库查询

36
     * @param string $query 数据库查询SQL字符串

37
     * @return bool|mysqli_result

38
     */

39
    public function query($query)

40
    {

41
        $handle = $this->_dbLink;

42
        $resource = @mysqli_query($handle, $query);

43
        if ($resource) {

44
            return $resource;

45
        } else {

46
            return false;

47
        }

48
    }

49
}

50

接下来是SQLite数据库的操作类(简化版),同样实现了数据库适配器接口:
2_Drivers\Db_Adapter_Sqlite.php:
<?php
/*** 定义SQLite数据库的操作类*/require_once 'Db_Adapter.php';class Db_Adapter_Sqlite implements Db_Adapter
{// 数据库连接字符串标示private $_dbLink;/*** 数据库连接函数* @param array $config 数据库配置* @return resource* @throws Exception*/public function connect($config){$this->_dbLink = sqlite_open($config['file'], 0666, $error);if ($this->_dbLink){return $this->_dbLink;}// 数据库异常throw new Exception($error);}/*** 执行数据库查询* @param string $query 数据库查询SQL字符串* @return bool|resource*/public function query($query){$handle = $this->_dbLink;$resource = @sqlite_query($query, $handle);if ($resource) {return $resource;} else {return false;}}
}

定义一个工厂类,根据不同的参数生成不同的数据库类,并实现简单的查询:
2_4_sql_factory.php:
1
<?php

2
/**

3
 * 定义一个工厂类,可以根据参数的不同生成不同的数据库类

4
 */

5
6
class SqlFactory

7
{

8
    public static function factory($type)

9
    {

10
        if (include_once '2_Drivers/Db_Adapter_' . $type. '.php') {

11
            $classname = 'Db_Adapter_' . $type;

12
            return new $classname;

13
        } else {

14
            throw new Exception('Driver not found');

15
        }

16
    }

17
}

18
19
$db = SqlFactory::factory('Mysqli');

20
$config = [

21
    'host' => 'localhost',

22
    'user' => 'root',

23
    'password' => '123456',

24
    'database' => 'test_laravel',

25
];

26
$db->connect($config);

27
$res = $db->query('SELECT * FROM articles');

28
while ($row = mysqli_fetch_row($res)) {

29
    var_dump($row);

30
}

31

注意:要调用时,可以这样写:
$db = sqlFactory:factory('Mysqli');
$db = sqlFactory:factory('Sqlite');

转载于:https://www.cnblogs.com/linewman/p/9918108.html

【工厂模式】设计模式之工厂模式【原创】相关推荐

  1. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  2. java 访客模式,设计模式 - 访客模式( Visitor Pattern)

    设计模式 - 访客模式( Visitor Pattern) 在Visitor模式中,我们使用一个访问者类来更改元素类的执行算法. 通过这种方式,元素的执行算法可以随着访问者的变化而变化. 此模式属于行 ...

  3. java 对象工厂_Java设计模式之--工厂方式

    在分析工厂模式之前,我们先看看普通模式下的Java三层结构. Controller(表现层)-Service(业务层)-Dao(持久层.数据库连接层),基于此三层结构完成JavaWeb相关业务. 假设 ...

  4. php 命令链模式,设计模式之------命令链模式

    /*** **命令链模式:松散耦合为主题,发送消息,命令和请求通过一组命令 **封装一系列操作 ** 一条命令被看做只执行了一个函数 ********/ Interface ICommand{ fun ...

  5. 抽象工厂模式设计模式_创新设计模式:抽象工厂模式

    抽象工厂模式设计模式 抽象工厂模式是一种创新模式,是与构建器和工厂模式一起最受欢迎的模式之一. 使用创建模式是为了创建对象,而不是直接使用构造函数创建对象. 抽象工厂模式提供了一种封装一组具有共同主题 ...

  6. 抽象工厂模式设计模式_抽象工厂设计模式解释

    抽象工厂模式设计模式 抽象工厂设计模式是工厂设计模式的另一种形式. 这种模式可以被视为"超级工厂"或"工厂工厂". 抽象工厂设计模式(属于"四人帮&q ...

  7. 设计模式之工厂模式(Factory)

    设计模式之工厂模式 设计模式之工厂模式 简介 代码准备 需求一 需求二 简单工厂 工厂方法 抽象工厂 需求三 总结 设计模式之工厂模式 简介 工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可 ...

  8. Java设计模式之策略模式+工厂模式+模板模式

    Java设计模式之策略模式+工厂模式+模板模式 1.策略模式+工厂模式+模板模式 个人的理解:实际开发工程中,一些业务很复杂的逻辑使用很多的 if 或者 if···else 语句,不利于维护和扩展,为 ...

  9. 从shiro源码角度学习工厂方法设计模式

    绪论 shiro是一个简单易用,功能强大的Java安全框架,学习其源码设计思想对我们的编码水平的提高大有裨益.现在,就从源码角度带大家学习一下shiro里面的工厂方法模式. 这里的前提是读者有过使用s ...

  10. 设计模式回顾——模板模式(C++)

    文章目录 1 前言 2 什么是模板模式 2.1 模板模式组成 2.2 模板模式UML图 2.3 模板模式作用 3 模板模式优缺点 4 什么地方使用模板模式 5 模板模式实现 6 模板模式与策略模式比较 ...

最新文章

  1. 如何挖掘系统的业务价值
  2. 【Python】keras使用LSTM拟合曲线
  3. Imagemagick常用指令
  4. Java高并发编程(十一):Java中线程池
  5. dotnet-httpie 0.2.0 Released
  6. [word技巧]把标题、图表题注编号由“一.1”改为“1.1“
  7. bool类型_Python基本数据类型之Number
  8. react打包后图片丢失_手写Webpack从0编译Vue/React项目
  9. SpringMVC框架----请求参数的绑定
  10. python图片横向合并_python3 图片横向合并
  11. C语言 指针与结构体
  12. Kotlin入门(2)让App开发变得更容易
  13. android json解析及简单例子+Android与服务器端数据交互+Android精彩案例【申明:来源于网络】...
  14. OpenCV_cv::Mat的深拷贝 浅拷贝问题
  15. 利用openssl之 htps服务端和客户端编写
  16. win7下获取进程CPU,内存,IO等信息
  17. 计算机可移动磁盘无法显示图片,移动硬盘不显示盘符原因及解决方法步骤介绍【图文详解】...
  18. 编程语言介绍以及特点
  19. 证明当x趋向于0时1-cosx的等价无穷小是(x^2/2)
  20. 淘宝怎么做推广?史上最全的淘宝流量入口整理

热门文章

  1. linux lib lib64 区别,lib,lib32,lib64,libx32和libexec之间的区别
  2. python 不执行函数_解决python调用自己文件函数/执行函数找不到包问题
  3. html如何使文本变为粗体_javascript – 如何使用节点和.createElement(“b”)使文本变为粗体?...
  4. JSTL 与 JSP 代码段 相互调用变量
  5. java 正则表达式语法_Java 正则表达式基础语法
  6. crowd counting_[crowd_counting]-MANet_arxiv1901
  7. 3目标检测的准确率_吊打YOLOv3!普林斯顿大学提出:CornerNetLite,基于关键点的实时且精度高的目标检测算法,已开源!...
  8. ubuntu20输入法qiehuan_Ubuntu20.04安装搜狗输入法
  9. Elasticsearch索引分析
  10. GUI可视化利器,让实时数据可视化so easy