设计模式-单例模式

最近工作比较少,赶紧抓紧时间给自己充电。
万万不能,现在不充电,到时候关键时刻断电就high了。
正好新买了电脑加机械键盘,coding都要飞起来了。

单例模式

单例模式用的最多的地方应该是sqlHelpler吧,笼统的来说应该是需要全局唯一的东西,类似于全局变量,但是在面向对象里应该是单例模式,通过一个不可以copy的类来统一管理这些变量,同时依靠着class的访问设置,保证了单例的属性不会像全局变量一样可能被修改。
保证一个类**仅有一个实例**,并提供一个访问它的全局访问点。
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

1.单例模式uml图

这里写图片描述

2. 单例模式设计过程。

单例模式的设计巧妙之处在于,通过将构造函数设计为private,使得单例类无法被copy或者直接实例化。

private function  __construct(){ }

这样会近乎完美的保护起来整个类,但是过度的保护导致连获取这个类的对象都无法做到。

于是我们利用一个public 的静态方法来获取一个类的对象。

private  static  $instance = null;

public   static function  getInstance(){
        if( empty(self::$instance)){
            self::$instance = new Singleton();
        }
        return self::$instance;
    }

最终在类外的调用方法如下:

$instance = Singleton::getInstance();
$instance->getInstance();

3. 单例模式完整php代码实现

<?php

class Singleton{

    //单例对象,设置为static,保证类唯一; 设置private,保证类外无法访问;
    private  static  $instance = null;

    //用于演示的,一个类的属性。
    private  $prop = array();

    /**
     * 不可对外访问的构造函数,确保类外无法实例化对象,但是同时也会导致该类无法实例化
     * @access private
     * @author sui
     * @date 2016-1-14
     */
    private function  __construct(){ }

    /**
     * 依靠对外可访问且静态的方法getInstance()来实例化对象。
     * 因为getInstance是类内部的函数,所以可以直接调用private construct()
     * 调用该静态方法会返回一个类的实例对象。所以也可以访问类的其他非静态方法。
     * @access public
     * @author sui
     * @date 2016-1-14
     */
    public static function  getInstance(){
        if( empty(self::$instance)){
            self::$instance = new Singleton();
        }
        return self::$instance;
    }

    public function getProp($key){
        return $this->prop[$key];
    }

    public function setProp($key,$val){
        $this->prop[$key] = $val;
    }

    private static function testStaicFunction(){
        echo "类内私有静态方法,不可直接被外部调用";
    }

    private function testFunction(){
        echo "类内私有方法,也不可以被实例化对象调用";
    }
}


$instance = Singleton::getInstance();
$instance->getInstance();

?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值