Fork me on GitHub
随笔 - 87  文章 - 0  评论 - 308  阅读 - 42万

和我一起学设计模式(—)

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

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

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

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

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

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

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

          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变量的,那么就不应当用静态方法,反之则可以用静态。也就是说,静态方法不需要通过例实对象就可以使用。

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

posted on   bjtqti  阅读(614)  评论(5编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示