单例/单体模式(Singleton)
单例/单体模式(Singleton)
首先,单例模式是对象的创建模式之一,此外还包括工厂模式。单例模式的三个特点:
1,该类只有一个实例
2,该类自行创建该实例(在该类内部创建自身的实例对象)
3,向整个系统公开这个实例接口
Java中大概是这个样子
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Singleton {
//私有,静态的类自身实例
private static Singleton instance = new Singleton();
//私有的构造子(构造器,构造函数,构造方法)
private Singleton(){}
//公开,静态的工厂方法
public static Singleton getInstance() {
return instance;
}
}
|
使用时
1
|
Singleton obj = Singleton.getInstance();
|
这个单例类在自身被加载时instance会被实例化,即便加载器是静态的。因此,对于资源密集,配置开销较大的单体更合理的做法是将实例化(new)推迟到使用它的时候。即惰性加载(Lazy loading),它常用于那些必须加载大量数据的单体。修改下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class LazySingleton {
//初始为null,暂不实例化
private static LazySingleton instance = null ;
//私有的构造子(构造器,构造函数,构造方法)
private LazySingleton(){}
//公开,静态的工厂方法,需要使用时才去创建该单体
public static LazySingleton getInstance() {
if ( instance == null ) {
instance = new LazySingleton();
}
return instance;
}
}
|
使用方式同上。
单例模式是Javascript最基本,最有用的模式之一。它提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码通过单一的变量进行访问。
单体在Javascipt中有许多用处,可以用来划分命名空间,以减少全局变量的泛滥。还可以用在分支技术中用来处理各浏览器的差异。
Javascript中单例模式的实现方式有多种,每一种都有自身的优点或缺点。
1,对象直接量实现最基本,最简单的单体
1
2
3
4
5
6
|
var Singleton = {
attr1 : 1,
attr2 : 'hello' ,
method1 : function (){alert( this .attr2);},
method2 : function (arg){}
}
|
这种方式中,对象所有成员都通过Singleton加点号访问。所有成员是公开的,没有私有的。在执行到变量Singleton时,会加载(实例化)自身,即非惰性加载。
此外method1用this访问单体的其它成员会存在一些风险,因为method1的上下文不是总是指向Singleton对象。
比如当把method1作为事件监听器时,this可能指向的是dom元素,这时可能会提示undefined。
2,闭包实现私有成员的单体
1
2
3
4
5
6
7
|
var Singleton = function (){
var attr = 1, fn = function (){};
return {
method : function (){ fn(); },
getAttr : function (){ return attr; }
};
}();
|
这种方式中var定义私有的成员属性attr,方法fn,然后返回一个公开的接口method和getAttr。今后修改实现时,接口方法method和getAttr不变,只需修改私有的attr和fn的具体实现。使用如下
1
2
|
Singleton.method();
Singleton.getAttr();
|
3,闭包实现私有成员的惰性实例化单体
var LazySingleton = function (){
var attr = 1, fn = function (){};
var obj = {
method : function (){ fn(); },
getAttr : function (){ return attr; }
};
function init(){
return obj;
}
return {getInstace: init};
}();
|
适用场合上面已经提到:对于那些必须加载大量数据的单体直到需要使用它的时候才实例化。使用方式是这样的
1
2
|
LazySingleton.getInstance().method();
LazySingleton.getInstance().getAttr();
|
4,又发现另一种
1
2
3
4
5
6
7
|
function singleton() {
var obj = new Object();
singleton = function () {
return obj;
};
return obj;
}
|
仅在第一次时会new,这个Object泛指自定义的所有类。
单例/单体模式(Singleton)相关推荐
- 单例测试模式中【饿汉式】与【懒汉式】的区别
package day25.thread;/** /*** @author Mr Chen* @create 2018-10-09 18:37* 单例测试模式:保证类在内存中只有一个对象*/ publ ...
- 单例设计模式(Singleton)附带案例代码仓库
目录 1 .单例模式的结构 2 .单例模式的实现 2.1.饿汉式(静态变量方式) 2.2.饿汉式(静态代码块方式) 2.3.懒汉式(线程不安全) 2.4.懒汉式(线程安全) 2.5.懒汉式(双重检查锁 ...
- 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)...
回到目录 之前的讲过两篇关于日志组件的文章,分别是<第一回 日志记录组件之自主的Vlog>和<第三回 日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志 ...
- 单体模式singleton
在c++实现单体模式和c#,java有些不同 .h class Param { public:static Param& GetIntance(){return m_param;}static ...
- 详细介绍javascript中的单体模式singleton(全面)
一.单体模式描述 1.单体模式是javascript中最基本但又最有用的模式之一,他可能比其他任何模式都常用. 2.这种模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一的 ...
- C++设计模式之单例工厂模式
今天居家办公第65天,疫情期间,每天抢菜,抢菜..抢菜完成之后,就学习一会设计模式吧,今天学习的内容是工厂模式. 个人觉得工厂模式主要是为了把创建对象的代码放到专门的工厂类里,其实把new的工作延迟到 ...
- python单例_Python - 单例模式(Singleton)
单例模式(Singleton) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23374575 单例模式 , 类的实例从始至终, ...
- 设计模式之单例设计模式(Singleton Pattern)详细剖析
文章目录 一.
- java 工厂 单例_java 单例模式和工厂模式实例详解
单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例. 私有的构造方法 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法 饿汉式单例 public class ...
最新文章
- zblog php 当前位置,zblogphp导航当前页突出显示的方法
- 如何用php获取网页表格,PHP获取网页上任意表格中内容的通用程序的制作
- 20 款优秀的数据可视化工具,总有一款你用的到!
- 二,八,十,十六进制之间转换的相应方法
- Redis学习---(10)Redis 集合(Set)
- 如何让 MSN 与应用系统紧密集成起来?
- MySQL创始人发邮件寻求中国帮助
- python画图小猪佩奇_用Python代码画小猪佩奇 Python简直太神奇了
- mousewheel事件
- Android录音声音大小判断,Android录音使用 byte 类型获取分贝或声音振幅
- vue3.0 ts版项目配置axios
- Vue——v-show的使用——2020.11.18
- 4:3比例 android 平板,分辨率与屏幕比例 决定你实际应用_平板电脑_平板电脑评测-中关村在线...
- mtk平台gsensor,msensor方向确定方法
- vuejs 项目生成二维码工具 vue-qr
- Learning Cocos2d-x for XNA(6)——场景切换和场景过渡效果
- 西瓜决策树-sklearn实现
- Ganymed-ssh2实现scp上传和下载文件,以及执行shell命令
- 【敏捷办公学习必备软件推荐】
- Linux下RTC时钟使用