首页 > php开发 > php中设计模式工厂模式和单例模式实例

php中设计模式工厂模式和单例模式实例

1.工厂模式

工厂模式是一种类,它具有为您创建对象的某些方法,您可以使用工厂类创建对象,而不直接使用 new,这样,如果您想要更改所创建的对象类型,只需更改该工厂即可,使用该工厂的所有代码会自动更改。

主要作用是降低耦合度,代码如下:

<?php
abstract class Operation {
    abstract public function getValue($num1, $num2);
    public function getAttr() {
        return 1;
    }
}
class Add extends Operation {
    public function getValue($num1, $num2) {
        return $num1 + $num2;
    }
}
class Sub extends Operation {
    public function getValue($num1, $num2) {
        return $num1 - $num2;
    }
}
class Factory {
    public static function CreateObj($operation) {
        switch ($operation) {
            case '+':
                return new Add();
            case '-':
                return new Sub();
        }
    }
}
$Op = Factory::CreateObj('-');
echo $Op->getValue(3, 6);
?>

用在真正开发中一般当做数据库选择类。

实例2 显示使用工厂方法的一个示例,代码如下:

<?php
interface IUser {
    function getName();
}
class User implements IUser {
    public static function Load($id) {
        return new User($id);
    }
    public static function Create() {
        return new User(null);
    }
    public function __construct($id) {
    }
    public function getName() {
        return "Jack";
    }
}
$uo = User::Load(1);
echo ($uo->getName() . "n");
?>

这段代码要简单得多,它仅有一个接口 IUser 和一个实现此接口的 User 类,User 类有两个创建对象的静态方法.PHP里通过工厂模式提高效率

我们建立以下四个文件,代码如下:

//index.php 

<?php
include_once ("f.inc.php");
$f = new factory;
$t1 = & $f->create('T1');
echo $t1->getName();
echo $config;
?>

//f.inc.php 

<?php
class factory {
    function factory() {
        $this->mClasses = array(
            'T1' => 't1.inc.php',
            'T2' => 't2.inc.php'
        );
    }
    function &create($class) {
        if (!class_exists($class)) {
            require_once ($this->mClasses[$class]);
        }
        return new $class;
    }
}
?>

//t1.inc.php 

<?php
global $config;
$config = 'surfchen';
class T1 {
    var $mName = 'name::T1';
    function getName() {
        return $this->mName;
    }
}
?>

//t2.inc.php 

<?php
class T2 {
    function T2() {
        echo 't2 is ok';
    }
}
?>

在index.php里,我们通过一个factory类来创建其他的类实例。

在factory里,保存有一个数组$this->mClasses,格式为array("类名"=>"类文件路径").

我们通过factory::create()来创建一个类实例的时候,在create()里,会首先检测类是否存在,如果不存在,就根据$this->mClasses把类对应的类文件包含进来。然后创建并返回一个该类的实例。

这样,我们只需要把factory类文件包含进执行的脚本(如index.php)中就可以了,大家可能还注意到了在t1.inc.php中的这两行代码,代码如下:global $config;$config='surfchen';

2.单例模式

简单来说,PHP单例模式就是一个功能用一个类来实现,并且在整个应用程序当中只有一个这个类的实例存在;

工厂模式强调的是面向对象的多态性,它可以把功能上的差异部分封装起来,对外实现共有的功能,比如说数据库的链接,由于数据库的不同,我们可能需要写不同的方法去实现数据库的链接,但作为应用程序来讲,它不需要了解数据库用的是MySQL还是Oracle,它只需要用query()这个方法去执行数据库的相应操作即可,这样就屏蔽了差异,使类更加健壮!代码如下:

<?php
class Mysql {
    public static $conn;
    public static function getInstance() {
        if (!self::$conn) {
            new self();
            return self::$conn;
        } else {
            return self::$conn;
        }
    }
    private function __construct() {
        self::$conn = "mysql_connect:"; //    mysql_connect('','','')
        
    }
    public function __clone() {
        trigger_error("Only one connection");
    }
}
echo Mysql::getInstance();
echo Mysql::getInstance();
?>

实际中用作数据库连接类和工厂模式一起使用,根据参数调用单例模式,可以提高资源使用效率.


本文地址:http://www.phprm.com/develop/fs1385.html

转载随意,但请附上文章地址:-)

标签:实例 设计 模式 工厂 单例模式

相关文章

发表留言