PHP设计情势之单例形式

  学习设计方式最难的业务正是清楚什么的设计形式适用于怎么着的风貌。

PHP设计格局之单例格局,PHP设计方式之情势

单例形式顾名思义,就是唯有二个实例,作为目的的创办格局,单例形式确定保证某2个类唯有三个实例,而且自行实例化并向整个类别提供那么些实例。

 

单例情势的多少个要点:

  一.有些类只可以有3个实例。

  二.务必自行创立那些实例。

  三.亟须自行向壹切连串提供那个实例。

 

何以要动用PHP单例形式?

  壹.PHP的使用有1个大方面是本着于数据库,2个行使中会存在大气的数据库操作,在利用面向对象的点子支付时,假设选用单例情势,就足以免止多量的new
操作消耗的能源,仍是能够减去数据库连接,那样就不轻易并发too many
connections意况。

  二.假设1个系统中供给四个类来全局调节某个配置信息,那么,使用单例方式能够很便利的实现。

  三.在贰遍页面请求中有益实行调治将养,因为全部代码都集聚在二个类中,能够在类中设置钩子,输出日志,制止各市的var_dump(),echo。

 

案例:

 

/**
 * 设计模式之单例模式
 * $_instance必须声明为静态的私有变量
 * 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
 * getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用
 * ::操作符只能访问静态变量和静态函数
 * new对象都会消耗内存
 * 使用场景:最常用的地方是数据库连接。
 * 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
 */
class man
{
    //保存例实例在此属性中
    private static $_instance;

    //构造函数声明为private,防止直接创建对象
    private function __construct()
    {
        echo '我被实例化了!';
    }

    //单例方法
    public static function get_instance()
    {
        var_dump(isset(self::$_instance));

        if(!isset(self::$_instance))
        {
            self::$_instance=new self();
        }
        return self::$_instance;
    }

    //阻止用户复制对象实例
    private function __clone()
    {
        trigger_error('Clone is not allow' ,E_USER_ERROR);
    }

    function test()
    {
        echo("test");

    }
}

// 这个写法会出错,因为构造方法被声明为private
//$test = new man;

// 下面将得到Example类的单例对象
$test = man::get_instance();
$test = man::get_instance();
$test->test();

// 复制对象将导致一个E_USER_ERROR.
//$test_clone = clone $test;

 

  如有不对,请指正。

http://www.bkjia.com/PHPjc/1228683.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1228683.htmlTechArticlePHP设计模式之单例模式,PHP设计模式之模式 单例格局顾名思义,就是唯有三个实例,作为对象的成立情势,单例格局确认保证某一个类唯有壹…

  单例形式是壹种创设型形式,它会限制应用程序,使其只得成立某以一定类品种的四个纯粹的实例。

单例形式的贯彻

  一.大家能够在类中行使一个静态属性,来有限支撑对于二个特定的类来讲只存在叁个十足的实例。

class Payment{
    static private $_instance = NULL;

}

  

  2.接下来,大家须要在类中创设2个静态方法,在类的实例不设有的时候,此方法将会创立二个以此类的实例,并且重返那些实例。

static function getInstance(){
    if(self::$_instance == NULL){
        self::$_instance = new Payment();
    }
    return self::$_instance;
}

  平时状态下,单例情势中的那些法子的名字命名叫getInstance(),在这几个办法中,会有三个尺度语句用于检查$_inistance属性是不是是3个NULL值。假如是,将会利用new关键字实例化本身,并赋值给那天性情,不然直接重回那么些个性。

  

  叁.今后那一个类能够依照这些主意应用:

$pay = Payment::getInstance();

 

单例方式的校正

  假使二个用户计划动用 new 或
clone
去创制这么些类的新对象,那么就能够获得多少个实例,那样就磨损了单例情势的范围。

  幸免这种气象产生的八个本领便是创设1个个体的构造函数:

private function __construct(){}
private function __clone(){}

  此时,用户尝试使用new去实例化那么些类,程序就能够发生3个指鹿为马。

 

行使情况比方

  单例形式是在一些范围必须选用单一实例的风貌中。比方,2个小卖部有且唯有多少个财务中央,集团的持有资产流入流出、财务制度等都由那么些财务焦点来保管。

  

  

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图