单例模式
2016-01-20 00:27
183 查看
单例模式(Singleton)是软件开发中较常用的一种设计模式思想,在有些情况下,某一个事物我们只需要生成一个实例对象即可。比如,一台计算机可以同时连接多台打印机,但在某一时刻只能处理其中某一台的打印业务,因此计算机的打印程序只能有一个,所以就要通过单例模式来实现该功能以避免两个打印作业同时输出到打印机中。
简单来说,单例模式就是在整个应用程序的生命周期中,单例类的实例对象最多只存在一个。
简单单例模式特点:
1.类自身负责保存并封装它的唯一实例;
2.这个类可以保证没有其他实例可以被创建;
3.这个类提供一个访问该实例的全局方法getInstance( )。
懒汉式单例:
单例类的唯一实例对象在你第一次调用getInstance( )时被实例化,如果你不调用getInstance( ),这个唯一对象是不存在的,为null。形象点说,懒汉式单例就是你不用它,它不会自己实例化,
[cpp] view
plain copy
public class Singleton
{
private static Singleton instance = null;
private Singleton(){};
public static Singleton getInstance()
{
if(instance == null)
{
instance = new Singleton();
}
return instance;
}
}
这个实现保证了只有在调用该类的时候对象才被初始化(延迟创建),但是缺点是线程不安全,当多个线程同时访问的时候,极可能实例化出多个对象。
饿汉式单例:
饿汉式与懒汉式相反,饿了会自己主动找东西吃,所以不用人催自己创建了唯一的单例对象,
[cpp] view
plain copy
public class Singleton
{
private static Singleton instance = new Singleton();//定义实例变量
private Singleton(){}; //私有化构造方法
public static Singleton getInstance()
{
return instance;
}
}
此实现是线程安全的,多个线程进行访问时不会实例化多个对象,因为static属性只会被初始化一次,缺点是无论是否用到该实例都会被初始化,无故的开销变大。
简单来说,单例模式就是在整个应用程序的生命周期中,单例类的实例对象最多只存在一个。
简单单例模式特点:
1.类自身负责保存并封装它的唯一实例;
2.这个类可以保证没有其他实例可以被创建;
3.这个类提供一个访问该实例的全局方法getInstance( )。
懒汉式单例:
单例类的唯一实例对象在你第一次调用getInstance( )时被实例化,如果你不调用getInstance( ),这个唯一对象是不存在的,为null。形象点说,懒汉式单例就是你不用它,它不会自己实例化,
[cpp] view
plain copy
public class Singleton
{
private static Singleton instance = null;
private Singleton(){};
public static Singleton getInstance()
{
if(instance == null)
{
instance = new Singleton();
}
return instance;
}
}
这个实现保证了只有在调用该类的时候对象才被初始化(延迟创建),但是缺点是线程不安全,当多个线程同时访问的时候,极可能实例化出多个对象。
饿汉式单例:
饿汉式与懒汉式相反,饿了会自己主动找东西吃,所以不用人催自己创建了唯一的单例对象,
[cpp] view
plain copy
public class Singleton
{
private static Singleton instance = new Singleton();//定义实例变量
private Singleton(){}; //私有化构造方法
public static Singleton getInstance()
{
return instance;
}
}
此实现是线程安全的,多个线程进行访问时不会实例化多个对象,因为static属性只会被初始化一次,缺点是无论是否用到该实例都会被初始化,无故的开销变大。
相关文章推荐
- 站内信设计
- mysql笔记01 MySQL架构与历史、Schema与数据类型优化
- linux文件一致性校验
- 未能加载文件或程序集“EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”
- C++模板数组实现有序数组的排列合并算法
- 探索生成有数字的图片以及在图片的右上角画小圆形状态标志等
- iOS Xcode behaviors个人常用Debug配置
- 看朱老师视频笔记-------C语言
- 算法学习--二叉搜索树
- scala函数式编程
- 多版本支持 API版本 运行环境检查 风格和主题
- shell判断字符串为空
- Android的WebView中js与java代码相互调用
- 如何优化cocos2d/x程序的内存使用和程序大小
- Android中的Handler机制
- 计算数组的逆序对个数
- DeprecationWarning: the sets module is deprecated
- 锁帧同步算法
- epoll为什么这么快,epoll的实现原理
- Swift语法基础入门四(构造函数, 懒加载)