和我一起学设计模式(—)
今天我们一起来学习单例模式:
首先要弄明白,什么叫单例模式?
概念: 在任何时候,应用程序中都只会有这个类仅有的一个实例存在。
单例模式也被认为是职责模式,因为它将创建对象的控制权委托到一个单一的访问点上。
其次,这么做的好处在哪?
这可以防止我们去打开数据库的多个连接或者不必要的使用多余的系统资源。在复杂的系统中,还可以起到维护应用程序状态的作用。
最后:它有哪些典型特征?
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变量的,那么就不应当用静态方法,反之则可以用静态。也就是说,静态方法不需要通过例实对象就可以使用。
下一次我们再一起学习工厂模式
标签:
php
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?