欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP 工厂模式使用方法

程序员文章站 2022-06-03 10:25:04
基本的工厂类 复制代码 代码如下: class myobject{ //对象将从工厂返回 } class myfactory{ public static function...
基本的工厂类
复制代码 代码如下:

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');