php设计模式

所谓设计模式 简单来说就是为了解决特定业务问题而提供的解决方案  php由于其本身的特点主要使用两种设计模式 一种是单例模式一种是工厂模式 

如果一个类只允许实例化一个对象 比如资源管理器 如果会实例化多个对象 不符合逻辑 这种情况就会使用到单例模式 

<?php 
/*
 * 实现 单例模式  一个类只能实例化一个对象 
 */
class singleton{
    //把构造函数私有化 这样外部就不可以实例化对象
    // 给函数一个属性用来存储实例化对象 然后每次调用getInstance都判断一下是否有对象 
    private static $instance = null;//外部只能得到他 不能操作
    private  function  __construct(){

    }
    //目前外部连一个对象都不能实例化 不符合业务需求 
    //提供一个实例化对象的入口 因为无法实例化 所以必须是静态的
    public static function __getInstance(){
        if((!self::$instance instanceof self)){
            #对象不存在
            self::$instance = new self();
        }
        return self::$instance;
        
    }
    #为了避免通过clone克隆函数  把clone方法私有
    private function __clone(){

    }
}/*
$s3 = new singleton();
var_dump($s3);报错*/
$s1 = singleton::__getInstance();
$s2 = singleton::__getInstance();
var_dump($s1,$s2);//object(singleton)#1(0){} object(singleton)#1(0){}说明只产生了一个 对象
/*$s3 = clone $s1;
var_dump($s3);报错*/

?>                                                  

 总结单例模式 就是三私一共  私有化构造方法 让外部无法通过new 实例化对象  私有化属性object 让外部无法对存储对象的属性进行操作 私有化clone克隆函数  让外部无法通过clone克隆出一样的对象 公开getInstance方法 给外部一个实例化对象的入口 静态方法 只能通过类调用 调用之后先判断类静态属性instance 是否是类对象 利用instance结构 如果不是 在方法内部通过new实例化对象并且赋值给类属性instance 如果已经是类对象了 直接返回类属性就好

 

如果一个工具类被实例化了很多次 那么当类名改变时  后面实例化都要改变 维护成本太大 所以就有了工厂模式 工厂模式为类提供了一个生产对象的流水线  所有想要实例化的操作都调用工厂类和对应 方法 后期维护也只要维护工厂和流水线方法节即可

<?php 
/*
 * 实现工厂模式、
 * 先提供三个类
 */
class Man{
    public function display(){
        echo "男人";
    }
}
class Woman{
    public function display(){
        echo "女人";
    }
}
class LadyBody{
    public function display(){
        echo "人妖";
    }
}
#工厂类
class HumanFactory{
    public static function getInstance($flot){   //$flot 代表标记
        switch($flot){
            case 'm' : return new Man();
            case 'w' : return new Woman();
            case 'l' : return new LadyBody();
            default : return null;
        }

    }
}
 $m = HumanFactory::getInstance('m');   //需要记得标记
 $w = HumanFactory::getInstance('w');
 $l = HumanFactory::getInstance('l');
 $m->display();
 $w->display();
 $l->display();

?>                                                  

如图以后如果woman类需要修改成girl类 只需要修改工厂流水线方法中一个new woman();就好 

单例模式解决一个类只允许出现一个实例化对象的问题   工厂模式提供相似类的流水化实例 便于以后维护

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值