【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
最近心血来潮,突然想学一下设计模式,据说设计模式非常难,不是据说,我看视频看的模模糊糊,然后书籍也买了本设计模式的书,什么UML图,好难,但是,假如一天学一个设计模式,不一定一下子全部搞懂呢,今天就来说下单利设计模式,刚刚看会,趁热打铁。总结下: 其实单利模式:
/*
1. 定义:一个类 只能允许有一个对象,只能被实例化一次。
1.不让进: 使类不能被实例化
2.留后门: 设置静态方法
3.给对象: 在静态方法里实例化该类
4.判初夜: 判断是否是 第一次产生该类的对象
5.设静态: 静态方法里 要使用静态属性
*/
<?php
class test{
//为了防止外部new这个类,所以构造方法用protected,这是单例模式的关键之处
protected function __construct(){
}
}
$test = new test();
?>
然后执行,因为是受保护的构造函数,所以一定报错。 这样的话就不能被实例化了,但是既然这样的话,我们应该怎么实现实例化呢
<?php
class test{
protected function __construct(){
}
//用一个静态变量存储类的实例,只有第一次实例化的时候才赋值,以后都直接给出静态实例
public static function getInstance(){
$_test = new test();
return $_test;
}
}
$test = test::getInstance();
var_dump($test); // object(test)[1]
?>
但是这个时候我们还没有做判断,对吧,要加个判断,使用静态属性跟方法:
<?php
class test{
protected function __construct(){
}
public static function getInstance(){
static $_test;
if (empty($_test)) {
$_test = new test();
}
return $_test;
}
}
$test1 = test::getInstance();
$test2 = test::getInstance();
$test3 = test::getInstance();
var_dump($test1,$test2,$test3);
echo $test1 == $test2 ? 'true' : 'false';
echo "<br>";
echo $test2 == $test3 ? 'true' : 'false';
echo "<br>";
echo $test1 == $test3 ? 'true' : 'false';
?>
object(test)[1]
object(test)[1]
object(test)[1]
true
true
true
单例的话,最长用在需要只使用这一个类,而不是会有多个类。打个比方。比如现在有个config类,这个类主要是存储这个项目的配置信息。如果说这个类能实例化多次的话,那么如果在代码运行中对配置进行了修改,那么你怎么知道是在哪个配置类中进行了修改了呢。这个时候的话使用单例模式,就避免了情况的发生,所有对于配置文件的改变都是基于这个类的实例进行修改的。而不会出现因为多个类的实例化,操作对于操作的改变没有进行实时的更新。而且,实例多个类库,占用内存也会非常的厉害,这样只实例化一次。是不是好处多多呢。
以上代码例子来自 链接:https://www.zhihu.com/question/35285158/answer/62151947 来源:知乎
评论(4)
引用来自“翱翔903”的评论
引用来自“老鼠会怕喵”的评论
引用来自“翱翔903”的评论
字都打错了引用来自“老鼠会怕喵”的评论
引用来自“翱翔903”的评论
字都打错了引用来自“翱翔903”的评论
字都打错了