首页 >后端开发 >php教程 >php设计模式中工厂模式和单例模式的区别

php设计模式中工厂模式和单例模式的区别

一个新手
一个新手原创
2017-10-18 09:07:562781浏览
//让该类在外界无法造对象
//让外界可以造一个对象,做一个静态方法返回对象
//在类里面通过让静态变量控制返回对象只能是一个。

单例模式的要点有三个:

  1. 一是某个类只能有一个实例;

  2. 二是它必须自行创建这个实例;

  3. 三是它必须自行向整个系统提供这个实例。

为什么要使用PHP单例模式

  1. 1. php的应用主要在于数据库应用, 一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的new 操作消耗的资源,还可以减少数据库连接这样就不容易出现 too many connections情况。

  2. 2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分。

  3. 3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。

class cat
{
    public $name;
    private function __construct()
    {

    }
    static $temp;
    static function new_ob()
    {
        if(empty(self::$temp)){
           self::$temp = new cat();
        }
        return self::$temp;
    }
    function  speak(){
        return "喵喵喵";
    }
}
//$mao = new cat();


//如果没有猫就造一个,然后等于新的xxx,如果有,直接等于。达到限制的目的。
//$mao;
//if (empty($mao)){
//    $mao = new cat();
//}
//    $xxx = $mao;

$mao = cat::new_ob();
$mao2 = cat::new_ob();
//给1猫改名字,2猫的名字输出为1猫改的名字。此为单例。
$mao->name = "py";

2.简单工厂模式

  • ①抽象基类:类中定义抽象一些方法,用以在子类中实现

  • ②继承自抽象基类的子类:实现基类中的抽象方法

  • ③工厂类:用以实例化所有相对应的子类

abstract class jsq
{
    public $a;
    public $b;

    function yunsuan(){
    }
}
//此为拓展
class jiafa extends jsq
{
    function  yunsuan()
    {
        //parent::yunsuan(); // TODO: Change the autogenerated stub
        return $this ->a+$this->b;
    }
}
class  jianfa extends jsq
{
    function yuansuan(){
        return $this->a-$this->b;
    }
}
class factory
{
   static function create($x){
       switch ($x){
           case "+":
               return new jiafa();
               break;
           case "-":
               return new jianfa();
               break;
       }
   }
}
//$j1 = new jiafa();
//$j1->a = 1;
//$j1->b = 2;
//$j1->yunsuan();

//尽量避免实例化对象,采用静态方法获取。
$jf = factory::create("+");
$jf->a = 1;
$jf->b = 2;
echo $jf->yunsuan();

以上是php设计模式中工厂模式和单例模式的区别的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn