工厂类是指包含一个专门用来创建其他对象的方法的类,工厂类在多态性编程实践中是至关重要的,它允许动态的替换类,修改配置,通常会使应用程序更加灵活,熟练掌握工厂模式高级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. linux下用Apache一个IP多个网站多域名配置方法

    如有两个域名,分别是desk.xker.com和tool.xker.com,需把这两个域名都绑定到IP是219.13.34.32的服务器上 1.首先需在域名供应商管理页面指定域名和IP的对应关系 2. ...

  2. Android学习笔记(十二)BroadcastReceiver的有序广播和优先级

    前两篇博文中简单整理了普通广播,其实还有有序广播,有序广播在开发中也是比不可少的,可以给广播接收者设定优先级来控制接受顺序,并却可以中断广播传递等等. 一.两种Broadcast: · 普通广播(No ...

  3. bzoj 1493: [NOI2007]项链工厂(线段树)

    1493: [NOI2007]项链工厂 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 1256  Solved: 545[Submit][Status] ...

  4. UIButton set touch handler in code

    One option is to set the button up using [myButton addTarget:yourOtherClass action:@selector(mySelec ...

  5. struts2环境搭建和第一个程序

    环境搭建 项目目录 导入依赖jar包,如上图lib目录所示. 不同的版本可能会不一样,没关系在tomcat启动时,如果报错java.lang.ClassNotFoundException,我们可以按照 ...

  6. Sysinternals Suite实用程序工具包

    Sysinternals Suite是微软出品的一套集成数十个绿色软件的实用程序工具包.就在2014年1月29日(官方日期),迎来了2014新版本 AccessChk为了确保创建安全的环境,Windo ...

  7. [Redux] Wrapping dispatch() to Log Actions

    We will learn how centralized updates in Redux let us log every state change to the console along wi ...

  8. android intent 隐式意图和显示意图(activity跳转)

    android中的意图有显示意图和隐式意图两种, 显示意图要求必须知道被激活组件的包和class 隐式意图只需要知道跳转activity的动作和数据,就可以激活对应的组件 A 主activity  B ...

  9. 使用tuple返回多个值

    17.4编写并测试findbook函数 #include<iostream> #include<vector> #include<string> #include& ...

  10. Cracking the coding interview-String

    关于字符串 问题描述:一般这类程序设计的题目较简单,通过设计字符串的反转,寻找子串,以及字符串的拼接.删除操作等问题. 问题 实现一个算法来判断一个字符串中的字符是否唯一(即没有重复)? 设计算法并写 ...