三。工厂模式和单例模式

设计模式
概念:所谓设计模式,就是一些解决问题的“常规做法”,是一种认为较好的经验总结。面对不同的问题,可能会有不同的解决办法,此时就可以称为不同的设计模式。
1、工厂模式
在实际应用中,我们总是需要去实例化很多很多的类——以得到对象。
则:我们可以设计出一个“工厂”(其实就是类),该工厂的作用(任务)就是为人们“生产”各种对象。这种工厂通常只要指定类名,就可以据此获取一个该类的对象。
举例:
<?php
   class factory{
      static function getInstance($className){
           if(file_exists('./class/' . $className . ".class.php")){
               $obj1 = new $className();
               return $obj1;
           }else{
               return null;
           }
      }
   }
   $obj1 = factory::getInstance("A"); //获取类A的一个对象
   $obj2 = factory::getInstance("B");//获取类B的一个对象
   $obj3 = factory::getInstance("A");//再获取类A 的一个对象
?>

2、单例模式
应用中的某种需求:
对于某些类,在使用它的时候,从头到尾(程序运行的开始到结束),都只需要一个对象,就可以完成所有任务。
单例:
某个类,只允许其“创建”出一个对象,即使去进行多次创建,也只能得到一个对象。
$obj1 = new A();
$obj2 = $obj1;  //此时还是1个对象,$obj2只是最终指向了跟$obj1同样的对象
$obj3 = new A(); //这时候才有了第二个对象。

但其实在php语言中,一个对象还可以使用clone运算符进行克隆,则就也会“生成”新对象。
因此,还需要在类中使用私有化措施来禁止克隆,最终

单例模式的核心代码实现如下:
<?php
    class B{
    private static $instance;    //实例化一个私有的静态属性,用来存放对象
    public static function getNew( ){
          if(!isset(B::$instance)){ //isset()在php中用来检测变量是否设置,该函数返回的是否布尔值
                          B::$instace=new self;   //new self对当前类创建一个对象

          }
          return B::$instance;   //B::$instance获取当前属性的值
    }
     private function __construct( ){ }  //定义了一个私有的构造函数,防止在外部new对象
     private function __clone( ){ }  //使用魔术方法,禁止在外部用clone运算符禁止克隆
    }
    $V1=B::getNew();  //调用方法创建对象,实现单例模式
?>

详细的理解单例模式:
用一个构造方法,是为了禁止new;
实例化一个属性,是为了禁止赋值对象;
创建一个私有的魔术方法,是为了防止用clone运算符克隆对象。
(1)、为了实现单例模式,定义了一个私有的构造函数,此时类外不能创建对象调用类中的方法,若需要创建一个对象,则需要在方法中用return new self;获取一个对象,此时方法需要用静态的方法,类外创建对象的形式为:$对象名=类名::方法名();
(2)、此时创建多对象还是会有不同的对象,此时需要在类中实例化一个私有的静态属性,在方法中用isset(类名::$属性名)函数判断静态属性是否赋值,若没有赋值,用静态属性储存对象new self;
(3)若在前两步完成的条件下,克隆一个创建的对象  $对象1=clone $对象2; 则会发现克隆出来的对象是一个新的标示符,此时发现单例模式并不完整,所以要在类中禁止克隆的发生,用魔术方法 private function __clone(){ }禁止克隆,魔术方法中没有语句,发生原理:clone运算符在克隆对象的时候,会先去调用__clone()魔术方法,此时把魔术方法设置成私有的,则克隆时调用不到此方法,禁止克隆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值