php之工厂模式
工厂类是指包含一个专门用来创建其他对象的方法的类,工厂类在多态性编程实践中是至关重要的,它允许动态的替换类,修改配置,通常会使应用程序更加灵活,熟练掌握工厂模式高级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之工厂模式的更多相关文章
- 23种设计模式--工厂模式-Factory Pattern
一.工厂模式的介绍 工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...
- javascript工厂模式和构造函数模式创建对象
一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...
- PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)
一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...
- PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)
最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...
- 设计模式之工厂模式VS抽象工厂
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- 菜鸟理解的工厂模式(Factory Pattern)是什么样子的?
直接开始说了,不浪费园友宝贵的时间! 什么是工厂模式? 在学习前,先问一下:"它是什么?". 工厂模式,它是项目里面常用的设计模式之一. 它是属于创建型模式,简单的理解创建型模式就 ...
- PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式
PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...
- 《JS设计模式笔记》构造函数和工厂模式创建对象
工厂模式 function createPerson (name,age,job) { var o=new Object(); o.name=name; o.age=age; o.job=job; o ...
- 从接口、抽象类到工厂模式再到JVM来总结一些问题
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...
- C#设计模式之简单工厂模式(Simple Factory)
1. 概述 简单工厂模式就是将一个类的实例化交给一个静态工厂来执行. 2. 使用频率 中 3. 模式结构 3.1 机构图 3.2 模式中的角色 Product:抽象类,把具体产品类公共的代码进行抽象和 ...
随机推荐
- Joomla的在线视频播放插件:AllVideos
一个很好的插件,只需要在文章中插入一条简单的语句就可以实现视频播放,视频可以位于网站服务器上或其他视频网站的. 例如:{f4v}ShaHua-H264{/f4v} 我在使用中只有一个地方觉得需要更 ...
- Project Euler 9
题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...
- Linux下常用I/O模型
Linux异步I/O是Linux内核中提供的一个相当新的增强.它是2.6版本内核的一个标准特性,异步非阻塞I/O背后的基本思想是允许进程发起很多I/O操作,而不用阻塞或等待任何操作完成.稍后或在接收到 ...
- [置顶] 在Ubuntu下实现一个简单的Web服务器
要求: 实现一个简单的Web服务器,当服务器启动时要读取配置文件的路径.如果浏览器请求的文件是可执行的则称为CGI程序,服务器并不是将这个文件发给浏览器,而是在服务器端执行这个程序,将它的标准输出发给 ...
- IAR右键无法跳转到定义 的解决方法
用IAR编译程序,有时候编译通过了,但是右键无法GO TO Definition 解决方法有两个: 第一.Tools -> Option -> Project 把Generate br ...
- Log接口的重新封装
闲来没事,看见当前的项目的日志形式有点冗余,每个类都需要声明确实有点繁琐, 因此重新将logback重新封装一下,供整个工程共享使用,版本是1.0.9. 代码如下: import java.lang. ...
- ar技术序章-SDK介绍和选择
转自: http://blog.csdn.net/kun1234567/article/details/10402535 ar技术序章-SDK介绍和选择 分类: Augmented Reality20 ...
- Js- 菜单
很简单的JS二级菜单显示,收藏 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...
- 【转】android多分辨率适配
前一阶段开发android项目,由于客户要求进行多分辨率适配,能够支持国内主流的分辨率手机.因此经过了几次开发走了很多弯路,目前刚刚领略了android多分辨率适配的一些方法. 先介绍一下所走的弯路, ...
- C++之枚举
1. 声明枚举类型格式 enum Day{ Mon,Tue=5,Wed};//Mon=0;Tue=5;Wed=6 enumDay1{Mon1,Tue1,Wed1};//Mon1=0;Tue1=1;We ...