文档章节

一天学一个设计模式之(一):单例模式

CuteBear
 CuteBear
发布于 2017/05/25 17:19
字数 710
阅读 92
收藏 0

【推荐】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 来源:知乎

© 著作权归作者所有

CuteBear
粉丝 4
博文 37
码字总数 13040
作品 0
徐汇
程序员
私信 提问
加载中

评论(4)

CuteBear
CuteBear 博主

引用来自“翱翔903”的评论

引用来自“老鼠会怕喵”的评论

引用来自“翱翔903”的评论

字都打错了
😆第一个给我评论的,哈哈,等下我看一下

回复@老鼠会怕喵 : 哈哈 应该是单例模式吧
😊恩恩,改过来了。
翱翔903
翱翔903

引用来自“老鼠会怕喵”的评论

引用来自“翱翔903”的评论

字都打错了
😆第一个给我评论的,哈哈,等下我看一下

回复@老鼠会怕喵 : 哈哈 应该是单例模式吧
CuteBear
CuteBear 博主

引用来自“翱翔903”的评论

字都打错了
😆第一个给我评论的,哈哈,等下我看一下
翱翔903
翱翔903
字都打错了
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0
JavaScript 的一些设计模式

设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会...

格西南
08/20
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
292
2

没有更多内容

加载失败,请刷新页面

加载更多

apache httpClient实现代理发送Post请求

CredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials( new AuthScope("host", port), new UsernamePasswordCredentials(username, password......

huangkejie
8分钟前
3
0
SpringCloud

单体应用存在的问题 ● 随着业务的发展,开发变得越来越复杂。 ● 修改、新增某个功能,需要对整个系统进行测试,重新部署。 ● 一个模块出现问题,很可能导致整个系统崩溃。 ● 多个开发团队...

Star永恒
19分钟前
3
0
contos7安装elasticsearch6.8

基于最近安装elasticsearch过程遇到的坑在这里总结一下,记录一下。 环境: elasticsearch基于Java,需要有Java环境,最新的es需要jdk11,这选择安装的事6.8.0,需要jdk8。 版本: 安装去官网...

eric_le
21分钟前
3
0
PHP 全链路追踪 Molten-Docker

#DockerfileFROM daocloud.io/php:7.2-fpm-alpineENV TIME_ZONE=Asiz/Shanghai RUN apk add linux-headers# Compile MoltenRUN set -xe && \ curl -LO https://git......

MrMyj
24分钟前
3
0
聊聊rocketmq producer的batch

序 本文主要研究一下rocketmq producer的batch batch rocketmq-client-4.6.0-sources.jar!/org/apache/rocketmq/client/producer/DefaultMQProducer.java public class DefaultMQProducer ex......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部