手机
当前位置:查字典教程网 >编程开发 >php教程 >PHP 工厂模式使用方法
PHP 工厂模式使用方法
摘要:基本的工厂类复制代码代码如下:classMyObject{//对象将从工厂返回}classMyFactory{publicstaticfun...

基本的工厂类

复制代码 代码如下:

class MyObject{

//对象将从工厂返回

}

class MyFactory{

public static function factory(){

return new MyObject():

}

}

$instance=MyFactory::factory();

使用工厂类解析图像文件

复制代码 代码如下:

<?php

interface IImage{

function getHeight();

function getWidth();

function getData();

}

class Image_PNG implements IImage{

private $_width,$_height,$_data;

public function __construct($file){

$this->_file=$file;

$this->_parse();

}

private function _parse(){

//完成PNG格式的解析工作

//并填充$_width,$_height,$_data;

}

public function getWidth(){

return $this->_width;

}

public function getHeight(){

return $this->_height;

}

public function getData(){

return $this->_data;

}

}

class Image_JPEG implements IImage{

private $_width,$_height,$_data;

public function __construct($file){

$this->_file=$file;

$this->_parse();

}

private function _parse(){

//完成JPEG格式的解析工作

//并填充$_width,$_height,$_data;

}

public function getWidth(){

return $this->_width;

}

public function getHeight(){

return $this->_height;

}

public function getData(){

return $this->_data;

}

}

class ImageFactory{

public static function factory($file){

$pathParts=pathinfo($file);

switch (strtolower($pathParts['extension']))

{

case 'jpg':

$ret=new Image_JPEG($file);

break;

case 'png':

$ret=new Image_PNG($file);

break;

default:

//有问题

}

if($ret instanceof IImage){

return $ret;

}else {

//有问题

}

}

}

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

//调用ImageFactoyr

$image=ImageFactory::factory('/path/to/my.jpg');

//$image是Image_JPEG类的一个实例

echo $image->getWidth();

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

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

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

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

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

复制代码 代码如下:

<?php

interface IDatabaseBindings{

public function userExists($email);

}

class PGSQL implements IDatabaseBindings{

protected $_connection;

public function __construct(){

$this->_connection=pg_connect('dbname=example_db');

}

public function userExists($email){

$emailEscaped=pg_escape_string($email);

$query="select 1 from users where email='".$emailEscaped."'";

if($result=pg_query($query,$this->_connection)){

return (pg_num_rows($result)>0)?true:false;

}else{

return false;

}

}

}

class MYSQL implements IDatabaseBindings{

protected $_connection;

public function __construct(){

$this->_connection=mysql_connect('localhost');

mysql_select_db('example_db',$this->_connection);

}

public function userExists($email){

$emailEscaped=mysql_real_escape_string($email);

$query="select 1 from users where email='".$emailEscaped."'";

if($result=mysql_query($query,$this->_connection)){

return (mysql_num_rows($result)>0)?true:false;

}else{

return false;

}

}

}

class DatabaseFactory{

public static function factory(){

$type=loadtypefromconfigfile();

switch ($type){

case 'PGSQL':

return new PGSQL();

break;

case 'MYSQL':

return new MYSQL();

break;

}

}

}

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

复制代码 代码如下:

//调用DatabaseFactoy

$db=DatabaseFactory::factory();

$db->userExists('person@example.com');

【PHP 工厂模式使用方法】相关文章:

PHP中的事务使用实例

PHP文件操作方法汇总

PHP使用flock实现文件加锁的方法

PHP4 与 MySQL 交互使用

PHP中is_dir()函数使用指南

PHP ajax 异步执行不等待执行结果的处理方法

php简单实现快速排序的方法

php动态函数调用方法

PHP5 安装方法

PHP date函数常用时间处理方法

精品推荐
分类导航