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

    CSS概述 CSS是层叠样式表(Cascading Style Sheets)用来定义网页的显示效果.可以解决html代码对样式定义的重复,提高了后期样式代码的可维护性,并增强了网页的显示效果功能.简 ...

  2. HW4.17

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  3. 从Spark-Shell到SparkContext的函数调用路径过程分析(源码)

     不急,循序渐进,先打好基础 Spark shell的原理 首先,我们清晰定位找到这几个. 1.spark-shell 2. spark-submit 3.spark-class  4.SparkSu ...

  4. Java StringTokenizer Example

    In Java, you can use StringTokennizer class to split a String into different tokenas by defined deli ...

  5. 学习动态性能表 v$sql

    学习动态性能表 第三篇-(1)-v$sql V$SQL中存储具体的SQL语句. 一条语句可以映射多个cursor,因为对象所指的cursor可以有不同用户(如例1).如果有多个cursor(子游标)存 ...

  6. hdoj 1541 Stars【线段树单点更新+最大值维护】

    Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  7. ASP.NET- 播放视频代码

    在网上找的,还不错,支持很多格式.只需要在页面放个lable,建一个放视频文件的文件夹movie,加入代码: protected void Page_Load(object sender, Event ...

  8. SpringNote02.Blog系统迁移到Linux下

    基于SpringMVC-Hibernate的博客系统还在继续开发中 . 项目地址:https://github.com/defshine/SpringBlog 整个项目迁移到linux下开发,安装in ...

  9. UDP打洞和心跳包设计

    一.设备终端class DeviceClient { int deviceID; int IP; int port; char connectID[16]; time_t lastTime; stru ...

  10. 本地nginx多域名映射

    前言: 工作两年多了,一直感觉技术上没有太大的长进,好多东西感觉会但是给别人讲起来的时候又感觉和没学过一样.以后希望能坚持写博客,把看过的东西都一点一滴积累下来.言归正传,今天要说的是nginx与ho ...