zoukankan      html  css  js  c++  java
  • 和我一起学设计模式(—)

      今天我们一起来学习单例模式:

                首先要弄明白,什么叫单例模式?

        概念: 在任何时候,应用程序中都只会有这个类仅有的一个实例存在。

       单例模式也被认为是职责模式,因为它将创建对象的控制权委托到一个单一的访问点上。

              其次,这么做的好处在哪?

              这可以防止我们去打开数据库的多个连接或者不必要的使用多余的系统资源。在复杂的系统中,还可以起到维护应用程序状态的作用。

           最后:它有哪些典型特征?

              1.它至少要有一个构造函数,并且被标记为私有(private)

              2.拥有一个保存类的实例的静态成员变量。

              3.拥有一个可以访问这个实例的公共的静态方法。

      和普通类不同的是,单例类不能在其它类中直接实例化,只能被其自身实例化。要做到这一点,必须要私有化它的构造函数,并且防止被克隆。用代码来实现一个单例,我们以创建数据库的连接为例:

        

    //get data class
    class DB {
    
        private $_db;
        private static $_instance;
    
        private function __construct(){
            $DSN = '../../content/xxtebook.db';
            $this->_db = new PDO('sqlite:'.$DSN);
        }
    
        //初始化数据库连接
        public static function initDB(){
            if(! (self::$_instance instanceof self)){
                self::$_instance = new self();
            }
            return self::$_instance;
          }
    
           //其它方法
      private function __clone(){}

    public function query($sql){}
    //.... }

    在外部使用这个单例:

    $db = DB::initDB();
    //$db->somMethod();

     另外对于哪些方法用静态,哪些方法不用,我的想法就是,如果方法内部要访问$this变量的,那么就不应当用静态方法,反之则可以用静态。也就是说,静态方法不需要通过例实对象就可以使用。

    下一次我们再一起学习工厂模式

  • 相关阅读:
    BZOJ2705[SDOi2012]Longge的问题
    Ubuntu 18.04 打不开1.1.0版本网易云音乐的解决方法汇总
    BZOJ3295[CQOI2011]动态逆序对(CDQ分治)
    hdu-4638-Group(树状数组)
    hdu-3333-Turing Tree(树状数组)
    UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]
    ZOJ-3597-Hit the Target!(线段树+扫描线)
    POJ-1177-Picture(线段树+扫描线+离散化)[矩形周长并]
    POJ-1151-Atlantis(线段树+扫描线+离散化)[矩形面积并]
    LightOJ 1135(线段树)
  • 原文地址:https://www.cnblogs.com/afrog/p/4119692.html
Copyright © 2011-2022 走看看