设计模式

深入理解单例设计模式

一、概述

单例模式是面试中经常会被问到的一个问题,网上有大量的文章介绍单例模式的实现,本文也是参考那些优秀的文章来做一个总结,通过自己在学习过程中的理解进行记录,并补充完善一些内容,一方面巩固自己所学的内容,另一方面希望能对其他同学提供一些帮助。

本文主要从以下几个方面介绍单例模式:

  1. 单例模式是什么
  2. 单例模式的使用场景
  3. 单例模式的优缺点
  4. 单例模式的实现(重点)
  5. 总结

二、单例模式是什么

23 种设计模式可以分为三大类:创建型模式、行为型模式、结构型模式。单例模式属于创建型模式的一种,单例模式是最简单的设计模式之一:单例模式只涉及一个类,确保在系统中一个类只有一个实例,并提供一个全局访问入口。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为。

三、单例模式的使用场景

1、 日志类

日志类通常作为单例实现,并在所有应用程序组件中提供全局日志访问点,而无需在每次执行日志操作时创建对象。

2、 配置类

将配置类设计为单例实现,比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。

3、工厂类

假设我们设计了一个带有工厂的应用程序,以在多线程环境中生成带有 ID 的新对象(Acount、Customer、Site、Address 对象)。如果工厂在 2 个不同的线程中被实例化两次,那么 2 个不同的对象可能有 2 个重叠的 id。如果我们将工厂实现为单例,我们就可以避免这个问题,结合抽象工厂或工厂方法和单例设计模式是一种常见的做法。

4、以共享模式访问资源的类

比如网站的计数器,一般也是采用单例模式实现,如果你存在多个计数器,每一个用户的访问都刷新计数器的值,这样的话你的实计数的值是难以同步的。但是如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题。

5、在Spring中创建的Bean实例默认都是单例模式存在的。

适用场景:

  • 需要生成唯一序列的环境
  • 需要频繁实例化然后销毁的对象。
  • 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
  • 方便资源相互通信的环境

常用PHP设计模式

 

  1. PHP设计模式之工厂方法模式(Factory Method)
  2. PHP设计模式之模板方法模式(Template Method)
  3. PHP设计模式之策略模式(Strategy)
  4. PHP设计模式之迭代器模式(Iterator)
  5. PHP设计模式之命令模式(Command)
  6. PHP设计模式之适配器模式(Adapter)
  7. PHP设计模式之单例模式(Singleton)
  8. PHP设计模式之观察者模式(Observer)
  9.  链接文章转自: 醉清风的博客

设计模式学习笔记-观察者模式

1. 概述

有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

2. 解决的问题

将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。…

PHP设计模式(三)

  • 注册器模式

这种模式比较简单好理解,在PHP框架中会经常用到,在某些比较大的PHP框架中,会在初始化时将一些常用的类实例放在注册器中,实际是存在注册器类中的一个静态数组中,以后想去用它的话,直接根据名称就可以获取到注册器中保存的实例。而不需要再次去new这个类、getInstance或者工厂方法获得。我感觉这种模式有点像是把单例模式和简单工厂模式结合起来了,实例化之后保存在一个静态数组中(类似单例模式的静态变量),然后可以根据不同的参数去获取注册过的实例,这里跟简单工厂模式相比较的话,他可以动态的添加实例进去,而不需要去修改代码,但这里要注意的就是必须先注册才可以获取。

这个模式要注意几个要点:

1. 首先就是要一个管理要注册的实例的类(例如:Register),我们就加他注册类吧。

2. 这个注册类必须有一个静态数组变量,采用键值数组(哈希)方式存储这些注册的实例,其中键对应实例名,值对应实例。

3. 当然了,_set、_get、_unset(采用下划线开始仅仅是因为unset是关键字,然后为了统一,就都加上了)这些方法都不能少,用来设置、获取、和销毁注册器中的内容。

PHP设计模式(二)

从最近开始我给自己定了个目标,每周至少更新2篇博客,用来记录自己在上一周里面遇到的问题或者想出的新点子,一方面对自己掌握的知识进行记录,免得时间久了忘得一干二净,二来我的博文虽然不怎么好但也许会对一小部分读者产生一定的影响,而且我相信随着我原创博文写的次数越来越多,肯定水平会越来越高,深度也会越来越深(哈哈,我也很羡慕那些出名的博主,不但专业知识很棒,而且文笔也棒的很)。一周两篇我发现完全记录不完我想记录的东西,就像这周,我还有日志系统、二进制数据缓存(其实叫low一点的数据库比较合适)、QQwry.dat数据解读、zip压缩文件增量生成这几个方面的都没有进写,在以后的时间里我会慢慢更新到我的博客的,好了不扯了,这次我来介绍另外一种模式。…

PHP设计模式(一)

在码PHP程序的时候,为了以后更好地维护代码和理解代码,用一些合适的设计模式是必不可少的,下面我和大家首先分享下单例模式,有错误或者不恰当的地方,还望PHPer们帮我指出。

  • 单例模式

PHP中的对象生存期间是从该脚本开始一直到该脚本结束为止,因此PHP的单例模式只是在一个页面中(这里可能包含很多其他页面,不是狭义的单页面)多次用到该对象时才会起作用,多次用到时不去重复的new对象(多个人做一个项目时,难免会碰到一次请求中多次实例一个对象的情况),将不会耗费不必要的资源(数据控连接操做效果很明显),还有一点就是可以保证整个脚本中都是同一个对象,这种模式是怎么实现的呢,他的实现有几个要注意的点:…