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

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  2. MySQL数据库MyISAM和InnoDB存储引擎的比较(转)

    MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种.这里介绍关于这两种引擎的一些基本概念(非深入介绍). MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索 ...

  3. Zend Framework 2参考Zend\Authentication(数据库表认证)

    + 转载自:Zend Framework 2参考Zend\Authentication(数据库表认证) 介绍 Zend\Authentication\Adapter\DbTable提供对存储在数据库表 ...

  4. Day 4 @ RSA Conference Asia Pacific & Japan 2016

    09.00 – 09.45 hrs Advanced Malware and the Cloud: The New Concept of 'Attack Fan-out' Krishna Naraya ...

  5. ios 记录支付宝集成遇到的坑及解决方法

    今天项目中要开始动手集成支付宝支付,在此小结一下.(目前新版的支付宝SDK有较大改版,去集成还需要自己去开发平台详细的按照集成步骤来完成https://doc.open.alipay.com/docs ...

  6. Excel文件上传

    *&---------------------------------------------------------------------* *& FORM FRM_UPDATA_ ...

  7. div 水平居中

    对需要水平居中的DIV层添加以下属性: margin-left: auto; margin-right: auto;

  8. Android框架之网络开发框架Volley

    1. Volley简单介绍 我们平时在开发Android应用的时候不可避免地都须要用到网络技术.而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进 ...

  9. [TypeScript] Reflection and Decorator Metadata

    TypeScript allows you to emit decorator metadata which enables more powerful features through reflec ...

  10. Java中PreparedStatement和Statement的用法区别(转)

    1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象.   2.作为 ...