PHP 工厂模式使用方法_php教程-查字典教程网
PHP 工厂模式使用方法
PHP 工厂模式使用方法
发布时间:2016-12-29 来源:查字典编辑
摘要:基本的工厂类复制代码代码如下: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教程学习
    编程开发子分类