Rumah >pembangunan bahagian belakang >tutorial php >php设计模式中工厂模式和单例模式的区别

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

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

单例模式的要点有三个:

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

Atas ialah kandungan terperinci php设计模式中工厂模式和单例模式的区别. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn