singleton(单件)-对象创建型模式

1.意图

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

2.动机

对一些类来说,只有一个实例是很重要的。让类自身负责保存它唯一的实例,这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。

3.适用性

  • 当类只能有一个实例而且客户可以从一个周所周知的访问点访问它时。
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

4.结构

5.代码实例

#include <iostream>
#include <Windows.h>

//静态成员实例的懒汉模式

class Singleton
{
public:
    static CRITICAL_SECTION gSection;
    static Singleton * GetInstance()
    {
        InitializeCriticalSection(&gSection);
        EnterCriticalSection(&gSection);
        if(NULL == m_pSingleton)
        {
            m_pSingleton = new Singleton();
        }
        return m_pSingleton;
        LeaveCriticalSection(&gSection);
    }

    void Print()
    {
        std::cout<<"Singleton is Created"<<std::endl;
    }

private:
    static Singleton* m_pSingleton;
    Singleton()
    {
    }

};
CRITICAL_SECTION Singleton::gSection;

Singleton* Singleton::m_pSingleton = NULL;

静态成员实例的懒汉模式

注意此实例的构造函数为私有的以防止使用时实例化此类。此实例加了临界区(也可加锁)以保证单例的线程安全,频繁加锁可能会有性能问题(处理大量数据时)。

class SingletonInside
{
public:
    static CRITICAL_SECTION CriticalSection;
    static SingletonInside * GetInstance()
    {
        InitializeCriticalSection(&CriticalSection);
        EnterCriticalSection(&CriticalSection);
        static SingletonInside instace;
        return &instace;
        LeaveCriticalSection(&CriticalSection);

    }

    void Print()
    {
        std::cout<<"SingletonInside is Created"<<std::endl;
    }

private:
    SingletonInside()
    {
    }
};
CRITICAL_SECTION SingletonInside::CriticalSection;

内部静态变量型饿汉模式

此内部静态变量只会初始化一次,因此每次获取实例时,获取的为同一个实例。

class SingletonStatic
{
public:
    static const SingletonStatic * GetInstance()
    {
        return m_SingletonInstance;
    }

    void Print()
    {
        std::cout<<"SingletonStatic is Created"<<std::endl;
    }

private:
    static const SingletonStatic * m_SingletonInstance;
    SingletonStatic()
    {
    }

};

const SingletonStatic* SingletonStatic::m_SingletonInstance = new SingletonStatic();

饿汉模式

静态成员初始化在进入main函数之前已经完成,此种实现没有争夺锁的性能问题。

#include "Singleton.h"

int main()
{
    auto pSingltonInstacne = Singleton::GetInstance();
    pSingltonInstacne->Print();

    auto pSingltonInside = SingletonInside::GetInstance();
    pSingltonInside->Print();

    auto pSingltonStatic = SingletonStatic::GetInstance();
    pSingltonStatic->Print();

    while(1);

}

Test.cpp

6.测试结果

7.效果

  • 对唯一实例的受控访问
  • 缩小名空间
  • 允许对操作和表示的精化
  • 允许可变数目的实例
  • 比类操作更灵活
时间: 2024-08-09 19:50:37

singleton(单件)-对象创建型模式的相关文章

Singleton 单件(创建型模式)

目的-- 创建型模式:负责对象创建. 结构型模式:处理类与对象间的组合. 行为型模式:类与对象交互中的职责分配. 范围-- 类模式处理与子类的静态关系. 对象模式处理对象间的动态关系. 保证一个类仅有一个实例,并提供一个该实例的全局访问点. public class SingleTon { private SingleTon(){} private static SingleTon instance; public static SingleTon Instance { } }

生成器模式(Builder)-- 对象创建型模式

1. 动机 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.一个RTF(Rich Text Format)文档交换格式的阅读器应能将RTF转换为多种正文格式.该阅读器可以将RTF文档转换成普通ASCII文本或转换成一个能以交互方式编辑的正文窗口组件.但问题在于可能转换的数目是无限的.因此要能够很容易实现新的转换的增加,同时却不改变RTF阅读器.其实也就是,前面的数据接卸(源头处理)归解析,后续的显示处理,由显示处理的部分来完成.在数据解析和显示处理之间架设一个标准的桥梁

设计模式(4)-对象创建型模式-Prototype模式

1.对象创建型模式 1.4          Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 ?P r o t o t y p e(Gr a p h i c) - 声明一个克隆自身的接口. ?C o n c r e t e P r o t o t y p e(S t a ff.W h o l e N o t e.H a l fN o t e) - 实现一个克隆自身的操作. ?  C l i e n t(G r a p h i c To o l) - 让一个原

设计模式(3)-对象创建型模式-Abstract Factory模式

1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: ?  一个系统要独立于它的产品的创建.组合和表示时(这个需求和FactoryMethod类似). ?  一个系统要由多个产品系列中的一个来配置时(这个需求也和Factory Method类似). ?  当你要强调一系列相关的产品对象的设计以便进行联合使用时(这个需求表明一个工厂要创建多个相关的产品对象,是比FactoryMethod多的

设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)

意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 ? 一个系统要独立于它的产品的创建.组合和表示时. ? 一个系统要由多个产品系列中的一个来配置时. ? 当你要强调一系列相关的产品对象的设计以便进行联合使用时. ? 当你提供一个产品类库,而只想显示它们的接口而不是实现时. 结构 模式结构图如下所示: Creator: 声明一个创建抽象产品对象的操作接口. ConcreteCreator:(Concrete

ProtoType(原型)-对象创建型模式

1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.动机 通过拷贝或者"克隆"一个类的实例来创建新的实例. 3.适用性 当一个系统应该独立于它的产品创建.构成和表示时,要使用Prototype模式:以及 当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者 为了避免创建一个与产品类层次平行的工厂类层次时或者 当一个类的实例只能有几个不同状态组合中的一种时.建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化该类更方便一些. 4.结构 5.代码

Factory Method(工厂方法)-对象创建型模式

1.意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 2.动机 框架使用抽象类定义和维护对象之间的关系.这些对象的创建通常也由框架负责. 3.适用性 当一个类不知道它所必须创建的对象的类的时候. 当一个类希望由它的子类来指定它所创建的对象的时候. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一局部化的时候. 4.结构 5.代码实例 class Product { public: vir

设计模式1—创建型模式

模式 在一定环境中解决某一问题的方案,包括三个基本元素--问题,解决方案和环境. 大白话:在一定环境下,用固定套路解决问题. 设计模式(Design pattern) 是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 设计模式的分类(Gang of Four的"DesignPatt

Java设计模式——单例模式(创建型模式)

概述 ??单例模式保证对于每一个类加载器,一个类仅有一个实例并且提供全局的访问.其是一种对象创建型模式.对于单例模式主要适用以下几个场景: 系统只需要一个实例对象,如提供一个唯一的序列号生成器 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例 ??单例模式的缺点之一是在分布式环境中,如果因为单例模式而产生 bugs,那么很难通过调试找出问题所在,因为在单个类加载器下进行调试,并不会出现问题. 实现方式 ??一般来说,实现枚举有五种方式:饿汉式.懒汉式.双