创建模式->单例模式
来源:互联网 发布:8月金融数据 编辑:程序博客网 时间:2024/05/21 07:15
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管
理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。 身份证号码 ,打印池
实现方法 ->让类自身负责保存它的唯一实例
名单件模式或单态模式
//单例模式 一个类只可以实例化一个对象 // 构造函数为私有的 但唯一的对象可以通过公有的GetInstance()获得// Singleton.hclass Singleton{public:static Singleton* GetInstance();private:Singleton();static Singleton* m_singleton;};// Singleton.cppSingleton* Singleton::m_singleton = NULL;Singleton* Singleton::GetInstance(){if(NULL == m_singleton){m_singleton = new Singleton();}return Singleton;}单例模式
单例模式优点:
1. 提供了对唯一实例的受控访问
2. 由于在系统内存中只存在一个对象,因此可以节约系统资源
3. 允许可变数目的实例。我们可以基于单例模式进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例
单例模式缺点:
1. 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难
2. 单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法(相比与 工厂模式相比)
3. 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;现在很多面向对象语言(如Java、C#)的运行环境都提供了自动垃圾回收的技术,因此,如果实例化的对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,下次利用时又将重新实例化,这将导致对象状态的丢失。
当涉及到多线程同时访问GetInstance() 函数时 需要加入lock 确保一个线程位于代码的临界区 这样另外一个线程就不进入临界区。其他线程要等待 进入
Singleton* Singleton::GetInstance(){lock(syncRoot){if(NULL == m_singleton){m_singleton = new Singleton();}}return Singleton;}
这样的不好之处在于每次调用GetInstance() 都要调用lock 我们可以加入双重锁定 Double-Check-Locking
Singleton* Singleton::GetInstance(){if(NULL == m_singleton){lock(syncRoot){if(NULL == m_singleton){m_singleton = new Singleton();}}}return Singleton;}当有两个NULL 的m_singleton时 第一个NULL==m_singleton都可以进入, 但是由于lock机制 只有一个可以进入第二个NULL if语句里, 这样第一个进入的new 了 第二个进入的无法再执行new了。
我们最先了解的就是懒汉式 例类 要在第一次引用时 才会将自己实例化 但这面临着 多线程问题 需要双重锁定解决 访问安全问题。
饿汉式 例类 在自己被加载时就将自己实例化了,提前占用了系统资源。保证安全问题。
饿汉式单例类在自己被加载时就将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。从速度和反应时间角度来讲,则比懒汉式单例类稍好些。
懒汉式单例类在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有
可能耗费大量时间,这意味着出现多线程同时首次引用此类的机率变得较大,需要通过同步化机制进行控制。
工厂模式
- 创建模式->单例模式
- 创建型模式--单例模式(Singleton)
- 创建模式中的单例模式
- 设计模式-创建型模式-单例
- 设计模式--创建性--单例模式
- 创建型模式-单例模式
- 创建型模式之单例模式
- 创建型设计模式-----单例模式
- 创建型模式--单例模式
- 创建模式——单例模式
- 创建型模式-单例模式
- 创建型模式:单例模式
- 创建型模式之单例模式
- 创建型模式 -- 单例模式
- 创建型模式之单例模式
- 创建型设计模式-单例模式
- 创建型模式-单例模式(singleton)
- 创建型模式之单例模式
- 开源最佳实践:Android平台页面路由框架ARouter
- 搭建 hexo,在执行 hexo deploy 后,出现 error deployer not found:git 的错误
- 排序算法 (一)
- 作业五
- 数据结构---队列---顺序表
- 创建模式->单例模式
- jsp 基础
- STL中list各个接口的使用
- qt安装Debugger
- idea Maven 打包jar
- C++作业5
- 作业5
- ON UPDATE CASCADE ON DELETE CASCADE
- spoj Interesting Game (数位dp+nim博弈)