珠峰培训javascript技术与前端技术论坛

 找回密码
 立即注册
查看: 1385|回复: 0

设计模式之单例模式

[复制链接]

23

主题

44

帖子

151

积分

注册会员

Rank: 2

积分
151
发表于 2015-3-23 18:18:37 | 显示全部楼层 |阅读模式
一,总体概要
顾名思义单例模式并不难理解,是产生一个类的唯一实例,在我们实际开发中也会使用到这种模式,它属于创建模式的一种,基于JS语言本身的语法特征,
对象直接量“{}”,也可以作为单例模式的一种表现形式,如下代码参考
  1. function Foo(){
  2.     this.bar = "Hello Singleton !" ;
  3. } ;
  4. var Singleton = {
  5.     instance : null ,
  6.     getInstance : function(){
  7.         if(!this.instance){
  8.             this.instance = new Foo() ;
  9.         }
  10.         return this.instance ;
  11.     }
  12. } ;
复制代码
就像这样当我们每次调用 Singleton.getInstance()时,就会得到唯一的实例。
单例模式是javascript最基本,最有用的模式之一,它提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码通过单一的变量进行访问。
单体在javascipt中有许多用处,可以用来划分命名空间,以减少全局变量的泛滥。还可以用在分支技术中用来处理各浏览器的差异。然我们再看几个例子(*^__^*)
  1. var Singleton = (function(){
  2.        var instance = null ;
  3.     function Foo(){
  4.         this.bar = "Hello Singleton !" ;
  5.     } ;
  6.     return{
  7.         getInstance : function(){
  8.             if(!instance){
  9.                 instance = new Foo() ;
  10.             }
  11.             return instance ;
  12.         }
  13.     } ;
  14. })() ;
复制代码
这是通过模块模式实现的。
  1. var Singleton = (function(){
  2.        var instance = null ;
  3.     function Foo(){
  4.         this.bar = "Hello Singleton !" ;
  5.     } ;
  6.     function createInstance(){
  7.         return new Foo() ;
  8.     } ;
  9.     return{
  10.         getInstance : function(){
  11.             if(!instance){
  12.                 instance = createInstance() ;
  13.             }
  14.             return instance ;
  15.         }
  16.     } ;
  17. })() ;
复制代码

这是结合工厂模式实现的单例方式。
单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。
二,源码案例参考
我们拿Bootstrap前端框架作为实例进行讲解,以下说的是"alert.js v3.3.1"中的源码,如下所示

这一这句代码,“if (!data) $this.data('bs.alert', (data = new Alert(this)))” 这就是单例的方式创建组件的实例对象,通过查找缓存在DOM节点的对象判断是否创建实例。
再给大家几个例子巩固单例模式的组织方式以及如何使用

再看一个,这属于惰性加载。


三,案例引入
今天我们将结合单例模式与工厂模式做一个小例子,以理解为主。
(1),创建单例类
  1. var Singleton = (function(){
  2.     var instance = null ;
  3.     function createInstance(type){
  4.         return factory.create(type) ;
  5.     } ;
  6.     return{
  7.         getInstance : function(type){
  8.             if(!instance){
  9.                 instance = createInstance(type) ;
  10.             }
  11.             return instance ;
  12.         }
  13.     } ;
  14. })() ;
复制代码

(2),创建工厂类
  1. var factory = (function(){
  2.     var instanceVendor = {
  3.         "foo" : function(){
  4.             return new Foo() ;
  5.         } ,
  6.         "zoo" : function(){
  7.             return new Zoo() ;
  8.         }
  9.     } ;
  10.     return {
  11.         create : function(type){
  12.             return instanceVendor[type]() ;
  13.         }
  14.     } ;
  15. })() ;
复制代码
(3),创建实体对象类
  1. function Foo(){
  2.     this.bar = "Hello Singleton !" ;
  3.     this.getBar = function(){
  4.         return this.bar ;
  5.     } ;
  6. } ;
复制代码

(4),创建客户端测试类
  1. function SingleClient(){
  2.     this.run = function(){
  3.          Singleton.getInstance("foo").getBar() ; // Hello Singleton !
  4.     } ;
  5. } ;
复制代码

四,总结一下
单例模式的要点有三个。
一,是某个类只能有一个实例;
二,是它必须自行创建这个实例;
三,是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点。
一,是单例模式的类只提供私有的构造函数,
二,是类定义中含有一个该类的静态私有对象,
三,是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|珠峰培训--JavaScript培训

GMT+8, 2017-9-22 15:46 , Processed in 0.133725 second(s), 22 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表