|
单列模式介绍
单例设计模式(Singleton),属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例
学习过程中,最重要的是理解,如果都不了解用途及定义,那基本没办法刻在脑子里。
单:含义就是一个人,比如单身狗,
列:我不懂怎么组成了!还是,我就定义他 “例”吧,一个实例
那么组合成的人话就是:一个用例。
哦,忘了,他有个英文名字:singleton (所提及的)单项物,单个的人;单身男子(或女子);(非孪生的)单生儿,单生幼畜
那就更好了解了:一个实例的存在!
保证一个类仅有一个实例,并提供一个访问它的全局访问点。 应用场景
那为什么有这个设计模式呢?如果连作用都不懂,我理解完后有有啥意义?
大多用于数据库连接,采用单例模式,只连接一次数据库,防止打开多个数据库连接。
运用用于一些只需要调用一次的场景。
应用介绍
- 一个班级只有一个班主任。
- Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
- 一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
应用实现
大家大概也知道用于什么场景了,那么改如何实现呢。
要实现单列模式需要符合一下条件才能认为是单例。
1、单例类只能有一个实例。
就只用实例化一次,多个不行。
2、单例类必须自己创建自己的唯一实例。
必须由类内部去调用
3、单例类必须给所有其他对象提供这一实例
允许所有其他对象去调用这个类
满足以上三点即单列模式
那么如何实现呢?
1.用例代码
单列模式连接数据库
class database {
private static $instance;
private function __construct()
{
// 单例类不能直接实例化创建,而是只能由类本身实例化。
// 因此,要获得这样的限制效果,构造函数必须标记为private,从而防止类被实例化。
}
private function __clone()
{
// // 在PHP中,为了防止他人对单例类实例克隆,通常还为其提供一个空的私有__clone()方法
}
// 2.单例类必须自己创建自己的唯一实例。
// 3.并且单例类必须给所有其他对象提供这一实例
public static function conn($server = '', $username = '', $password = '')
{
if (self::$instance instanceof self) {
$con = @mysqli_connect($server, $username, $password);
self::$instance = $con;
}
return self::$instance;
}
}
instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例: 2.执行结果
$a = database::conn('localhost', 'root', '');
$b = database::conn('localhost', 'root', 'root');
// 1、单例类只能有一个实例。
var_dump($a == $b);
// bool(true)正常的单例,无论调用多少次,最终只会有一个实例。
非常的简单。那么有人就会问了,按正常的调用会是什么结果?
那我在下面试一下给大家看看。
不用单列模式用例
class database1 {
public static $conn;
public static function conn($server = '', $username = '', $password = '')
{
// 假设以下已连接完成数据库操作,并返回连接内容
// ....
$con = @mysqli_connect($server, $username, $password);
self::$conn = $con;
return self::$conn;
}
}
$a = database1::conn('localhost', 'root', '');
$b = database1::conn('localhost', 'root', 'root');
var_dump($a == $b);
// bool(false)两者对比,明显看出,同样的连接方式,却不相同。这就是单列模式的用处。
那么单例模式介绍就没啦,是不是很简单。如果对你有帮助就点赞收藏吧~谢谢 |
|