设计模式-单例模式

设计模式-单例模式

说明

作为对象的创建模式,单例模式确保某一个类只有一个实例,并且对外提供这个全局实例的访问入口。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。


实现说明

定义: 一个类 只能允许有 一个对象存在.

1.使类不能被实例化
2.创建一个允许外部访问的静态方法
3.在静态方法里实例化该类
4.禁止覆盖产生对象
5.禁止clone产生对象

<h5>常用场景</h5>

在日常开发中缓存对象、日志对象、数据库操作对象等全局操作对象常被设计成单例。

单例模式实现过程

<h5>使类不能被实例化</h5>

//封锁new方法
class sigle{
    protected function __construct()
    {
    }
}

<h5>在静态方法里实例化该类</h5>

class sigle{
    protected function __construct()
    {
    }

    public static function getIns(){
        return new self();
    }
}

<h5>创建一个允许外部访问的静态方法</h5>

class sigle{
    protected  static $ins = null; //存储类
    protected function __construct()
    {
    }

    public static function getIns(){
        if(self::$ins == null){
            self::$ins = new self();
        }
        return self::$ins;
    }
}

<h5>禁止覆盖产生对象</h5>

//方法前加final,则方法不能呗覆盖,类之前加final,则类不能被继承
class sigle{
    protected  static $ins = null;
    final protected function __construct()
    {
    }

     public static function getIns(){
        if(self::$ins == null){
            self::$ins = new self();
        }
        return self::$ins;
    }
}

<h5>防止clone产生新对象</h5>

class sigle{
    protected  static $ins = null;
    //禁止外部直接创建对象,禁止继承后覆盖
    final protected function __construct()
    {
    }
    //禁止外部直接clone对象,禁止继承后覆盖
    final protected function __clone()
    {
        // TODO: Implement __clone() method.
    }

    public static function getIns(){
        if(self::$ins == null){
            self::$ins = new self();
        }
        return self::$ins;
    }
}

<h5>测试</h5>

class sigle{
    protected  static $ins = null;
    //禁止外部直接创建对象,禁止继承后覆盖
    final protected function __construct()
    {
    }
    //禁止外部直接clone对象,禁止继承后覆盖
    final protected function __clone()
    {
        // TODO: Implement __clone() method.
    }

    public static function getIns(){
        if(self::$ins == null){
            self::$ins = new self();
        }
        return self::$ins;
    }
}
$s1=sigle::getIns();
$s2=sigle::getIns();

if($s1 === $s2){
    echo "s1和s2是一个对象";
}else{
    echo "s1和s2不是一个对象";
}
结果:
 object(sigle)#1 (0) { }
 object(sigle)#1 (0) { } 
 s1和s2是一个对象

结尾

心如花木,向阳而生。

添加新评论