工厂类是指包含一个专门用来创建其他对象的方法的类,工厂类在多态性编程实践中是至关重要的,它允许动态的替换类,修改配置,通常会使应用程序更加灵活,熟练掌握工厂模式高级PHP开发人员是很重要的。

工厂模式通常用来返回符合类似接口的不同的类,工厂的一种常见用法就是创建多态的提供者,从而允许我们基于应用程序逻辑或者配置设置来决定应实例化哪一个类,例如,可以使用这样的提供者来扩展一个类,而不需要重构应用程序的其他部分,从而使用新的扩展后的名称 。

通常,工厂模式有一个关键的构造,根据一般原则命名为Factory的静态方法,然而这只是一种原则,工厂方法可以任意命名,这个静态还可以接受任意数据的参数,必须返回一个对象。

基本的工厂类

01     class MyObject{
02 //对象将从工厂返回
03 }
04
05 class MyFactory{
06 public static function factory(){
07 return new MyObject():
08 }
09 }
10
11
12 $instance=MyFactory::factory();

使用工厂类解析图像文件

01     <?php
02 interface IImage{
03 function getHeight();
04 function getWidth();
05 function getData();
06 }
07
08 class Image_PNG implements IImage{
09
10 private $_width,$_height,$_data;
11
12 public function __construct($file){
13 $this->_file=$file;
14 $this->_parse();
15 }
16
17 private function _parse(){
18
19 //完成PNG格式的解析工作
20 //并填充$_width,$_height,$_data;
21 }
22
23
24 public function getWidth(){
25 return $this->_width;
26 }
27 public function getHeight(){
28 return $this->_height;
29 }
30
31 public function getData(){
32 return $this->_data;
33
34 }
35
36 }
37
38 class Image_JPEG implements IImage{
39
40 private $_width,$_height,$_data;
41
42 public function __construct($file){
43 $this->_file=$file;
44 $this->_parse();
45 }
46
47 private function _parse(){
48
49 //完成JPEG格式的解析工作
50 //并填充$_width,$_height,$_data;
51 }
52
53
54 public function getWidth(){
55 return $this->_width;
56 }
57 public function getHeight(){
58 return $this->_height;
59 }
60
61 public function getData(){
62 return $this->_data;
63
64 }
65
66 }
67
68 class ImageFactory{
69
70 public static function factory($file){
71 $pathParts=pathinfo($file);
72 switch (strtolower($pathParts['extension']))
73 {
74 case 'jpg':
75 $ret=new Image_JPEG($file);
76 break;
77 case 'png':
78 $ret=new Image_PNG($file);
79 break;
80 default:
81 //有问题
82
83
84 }
85 if($ret instanceof IImage){
86 return $ret;
87 }else {
88 //有问题
89 }
90 }
91 }

当使用图像文件名调用 工厂方法时,根据传入的文件类型不同,取得不同对象。

1     //调用ImageFactoyr
2 $image=ImageFactory::factory('/path/to/my.jpg');
3 //$image是Image_JPEG类的一个实例
4 echo $image->getWidth();

使用工厂类解决数据库可移值性问题

在数据库应用程序中,工厂模式可以在以下两个方面起作用。

1.使软件更容易支持各种不同的数据库平台,用于扩展用户群

2.如果软件是内部使用,需要修改数据库时,可以容易将应用程序移值到别一个平台

在代码中,创建了一个名为User的数据库表来测试它,这个表定义一个名为email的varchar类型字段

01     <?php
02 interface IDatabaseBindings{
03 public function userExists($email);
04 }
05
06 class PGSQL implements IDatabaseBindings{
07 protected $_connection;
08
09 public function __construct(){
10
11 $this->_connection=pg_connect('dbname=example_db');
12 }
13
14 public function userExists($email){
15
16 $emailEscaped=pg_escape_string($email);
17 $query="select 1 from users where email='".$emailEscaped."'";
18 if($result=pg_query($query,$this->_connection)){
19 return (pg_num_rows($result)>0)?true:false;
20 }else{
21 return false;
22 }
23 }
24
25 }
26
27 class MYSQL implements IDatabaseBindings{
28
29 protected $_connection;
30
31 public function __construct(){
32
33 $this->_connection=mysql_connect('localhost');
34 mysql_select_db('example_db',$this->_connection);
35 }
36
37 public function userExists($email){
38
39 $emailEscaped=mysql_real_escape_string($email);
40 $query="select 1 from users where email='".$emailEscaped."'";
41 if($result=mysql_query($query,$this->_connection)){
42 return (mysql_num_rows($result)>0)?true:false;
43 }else{
44 return false;
45 }
46 }
47
48 }
49
50 class DatabaseFactory{
51
52 public static function factory(){
53 $type=loadtypefromconfigfile();
54 switch ($type){
55 case 'PGSQL':
56 return new PGSQL();
57 break;
58 case 'MYSQL':
59 return new MYSQL();
60 break;
61 }
62 }
63
64
65 }

应用程序不必知道它与何种类型的数据库连接,只会基于IDatabaseBindings接口定义的规则直接与工厂返回的实例打交道。

php之工厂模式的更多相关文章

  1. 23种设计模式--工厂模式-Factory Pattern

    一.工厂模式的介绍       工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...

  2. javascript工厂模式和构造函数模式创建对象

    一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...

  3. PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...

  4. PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)

    最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...

  5. 设计模式之工厂模式VS抽象工厂

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  6. 菜鸟理解的工厂模式(Factory Pattern)是什么样子的?

    直接开始说了,不浪费园友宝贵的时间! 什么是工厂模式? 在学习前,先问一下:"它是什么?". 工厂模式,它是项目里面常用的设计模式之一. 它是属于创建型模式,简单的理解创建型模式就 ...

  7. PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式

    PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...

  8. 《JS设计模式笔记》构造函数和工厂模式创建对象

    工厂模式 function createPerson (name,age,job) { var o=new Object(); o.name=name; o.age=age; o.job=job; o ...

  9. 从接口、抽象类到工厂模式再到JVM来总结一些问题

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...

  10. C#设计模式之简单工厂模式(Simple Factory)

    1. 概述 简单工厂模式就是将一个类的实例化交给一个静态工厂来执行. 2. 使用频率 中 3. 模式结构 3.1 机构图 3.2 模式中的角色 Product:抽象类,把具体产品类公共的代码进行抽象和 ...

随机推荐

  1. SQL SERVER 自定义函数 整数转成指定长度的16进制 转换成指定长度的16进制 不足补0

    最近做项目扩展的时候,遇到问题就是将整型转换成指定长度的16进制 刚开始就是直接使用 cast(12 as varbinary(4))但是发现这个不能解决我的问题 所以就上网搜了一下,然后改了改,下面 ...

  2. [NOIP2005]采药

    2005年NOIP全国联赛普及组 [题目描述 Description] 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个 ...

  3. android camera(四):camera 驱动 GT2005

    摄像头主要参数: 1.MCLK  24MHz: 2.PCLK  48~52MHz~: 3.电压 1.8V(1.5V).2.8V: 4.scl(IIC时钟)100KHz或者400KHz. 下载:常用摄像 ...

  4. 编译 Spring-framework的经验分享

    Spring-framework source codegit url: git clone git://github.com/SpringSource/spring-framework.git 导入 ...

  5. repeater灵活运用、repeater的commmand用法、如何不用repeater展示数据

    实体类: using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <su ...

  6. Jmeter聚合报告分析

    Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值 Average:平均响应时间--默认情况下是单个 Re ...

  7. Ubuntu14.04搭建cocos2dx2.2.5开发环境(超级具体)

    一 下载解压 官方下载地址:http://www.cocos2d-x.org/download 下载下来之后解压完毕之后会得到一个文件夹cocos2d-x-2.2.5 二 编译 1 安装依赖 cd到c ...

  8. POJ 1182 (经典食物链 /并查集扩展)

    (參考他人资料) 向量偏移--由"食物链"引发的总结 http://poj.org/problem?id=1182这道食物链题目是并查集的变型.非常久曾经做的一次是水过的,这次 ...

  9. [React] React Fundamentals: JSX Deep Dive

    "JSX transforms from an XML-like syntax into native JavaScript. XML elements and attributes are ...

  10. ubuntu下linux内核源码阅读工具和调试方法总结

    http://blog.chinaunix.net/uid-20940095-id-66148.html 一 linux内核源码阅读工具 windows下当然首选source insight, 但是l ...