PHP 工厂模式使用方法

基本的工厂类
<div class="codetitle"><a style="CURSOR: pointer" data="57108" class="copybut" id="copybut57108" onclick="doCopy('code57108')"> 代码如下:

<div class="codebody" id="code57108">
class MyObject{
//对象将从工厂返回
}
class MyFactory{
public static function factory(){
return new MyObject():
}
}
$instance=MyFactory::factory();

使用工厂类解析图像文件
<div class="codetitle"><a style="CURSOR: pointer" data="48822" class="copybut" id="copybut48822" onclick="doCopy('code48822')"> 代码如下:
<div class="codebody" id="code48822">
<?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,$_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,$_data;
public function construct($file){
$this->_file=$file;
$this->_parse();
}
private function _parse(){
//完成JPEG格式的解析工作
//并填充$_width,$_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类型字段
<div class="codetitle"><a style="CURSOR: pointer" data="26796" class="copybut" id="copybut26796" onclick="doCopy('code26796')"> 代码如下:
<div class="codebody" id="code26796">
<?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接口定义的规则直接与工厂返回的实例打交道。
<div class="codetitle"><a style="CURSOR: pointer" data="66317" class="copybut" id="copybut66317" onclick="doCopy('code66317')"> 代码如下:<div class="codebody" id="code66317">
//调用DatabaseFactoy
$db=DatabaseFactory::factory();
$db->userExists('person@example.com');

PHP工厂模式

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...