//---------------------------15/04/09----------------------------

//Singleton 单例模式-----对象创建型模式

/*

1:意图:

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

2:动机

3:适用性:

1>当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。

2>当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码

就能使用一个扩展的实例时。

4:结构:

Singleton:

static Instance()

{return uniqueInstance}

SingletonOperation()

GetSingletonData()

static uniqueInstance

singletonData

5:参与者:

Singleton:

1>定义一个Instance操作,允许客户访问它的唯一实例。Instance时一个类操作:

就是C++中的一个静态成员函数。

2>可能负责创建它自己的唯一实例。

6:协作:

客户只能通过Singleton的Instance操作访问一个Singleton实例。

7:效果:

1>对唯一实例的受控访问:

因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。

2>缩小名空间:

Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间。

3>允许对操作和表示的精华:

Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。

可以用需要的类的实例在运行时刻配置应用。<未知标记>

4>允许可变数目的实例:

通过改变允许访问Singleton实例的操作,来实现控制应用所使用的实例的数目。

5>比类操作更灵活:

另一种封装单件功能的方式是使用类操作:就是静态成员函数。

8:实现:

1>保证一个唯一的实例:

就是使用一个类操作来获得实例:                                     */

//这样实现是有线程安全问题的

class Singleton

{

public:

static Singleton* Instance();

protected:

Singleton();

private:

static Singleton* _instance;

};

Singleton* Singleton::_instance =;

Singleton* Singleton::Instance()

{

if(_instance ==
)

_instance =new Singleton;

return _instance;

}

//      2>创建Singleton类的子类:

//        使用单件注册表:

class Singleton

{

public:

static
void Register(constchar* name, Singleton*);

static Singleton* Instance();

protected:

static Singleton* Lookup(constchar* name);

private:

static Singleton* _instance;

static map<char*,Singleton*> _registry;//感觉map更好用

};

Singleton* Singleton::Instance()

{

if(_instance ==
)

{

const
char* singletonName = getenv("SINGLETON");

_instance = Lookup(singletonName);

}

return _instance;

}

//子类注册:在构造函数中注册自己

MySingleton::MySingleton()

{

Singleton::Register("MySingleton",this);

}

//这个构造函数只有被调用了,注册表中才有MySingleton,所以要在实现文件中定义一个静态实例

static MySingleton theSingleton;

//  9:代码示例:

class MazeFactory

{

public:

static MazeFactory* Instance();

static
void Register(constchar* name, MazeFactory*);

protected:

MazeFactory();

static MazeFactory* Lookup(constchar* name);

private:

static MazeFactory* _instance;

static map<char*,MazeFactory*> _registry;

};

MazeFactory* MazeFactory::_instance =;

MazeFactory* MazeFactory::Instance()

{

if(_instance =
)

{

const
char* mazeName = getenv("MAZESTYLE");

_instance = Lookup(mazeName);

}

return _instance;

}

void MazeFactory::Register(constchar* name, MazeFactory*  fac)

{

_registry.insert(std::make_pair(name,fac));

}

MazeFactory* MazeFactory::Lookup(constchar* name)

{

map<char*,MazeFactory*>::iterator it=_registry.find(name);

if(it != _registry.end())

return it->second;

return
;

}


设计模式 笔记 单例模式 Singleton的更多相关文章

  1. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  2. 设计模式(4) -- 单例模式(Singleton)

    设计模式(4)  -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...

  3. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)

    原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...

  4. 【设计模式】单例模式-Singleton

    [设计模式]单例模式-SingletonEnsure a class has only one instance, and provide a global point to access of it ...

  5. 设计模式之——单例模式(Singleton)的常见应用场景

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  6. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  7. 设计模式一: 单例模式(Singleton)

    简介 单例模式是属于创建型模式的一种(另外两种分别是结构型模式,行为型模式).是设计模式中最为简单的一种. 英文单词Singleton的数学含义是"有且仅有一个元素的集合". 从实 ...

  8. 设计模式之——单例模式(Singleton)的常见应用场景(转):

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  9. java设计模式之 单例模式 Singleton

    static 的应用 单例模式 Singleton 单例:保证一个类在系统中最多只创建一个实例. 好处:由于过多创建对象实例,会产生过多的系统垃圾,需要GC频繁回收,由于GC会占用较大的系统资源,所有 ...

随机推荐

  1. textbox只允许输入数字

    private void txtUserId_KeyPress(object sender, KeyPressEventArgs e) { //如果输入的不是数字键,也不是回车键.Backspace键 ...

  2. CSS| 解决子级用css float浮动 而父级div没高度不能自适应高度

    解决子级用css float浮动 而父级div没高度不能自适应高度 解决子级对象使用css float浮动 而父级div不能自适应高度,不能被父级内容撑开解决方法,父级div没有高度解决方法. 最外层 ...

  3. Linux load average负载量分析与解决思路

    一.load average top命令中load average显示的是最近1分钟.5分钟和15分钟的系统平均负载.系统平均负载表示 系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或 ...

  4. Windows 软件推荐大全【all】

    FastStone: 视频下载王: IDE: FinalShell:   免费海外服务器远程桌面加速,ssh加速,双边tcp加速,内网穿透.FinalShell使用---Xshell的良心国产软件 P ...

  5. EF5.0中的跨数据库操作

    以前在用MVC + EF 的项目中,都是一个数据库,一个DbContext,因此一直没有考虑过在MVC+EF的环境下对于多个数据库的操作问题.等到要使用时,才发现这个问题也不小(关键是有个坑).直接说 ...

  6. SQLite简单使用记录

    SQLite,一种轻量级的数据库 想要使用的话首先下载安装包. https://www.sqlite.org/download.html 下载sqlite-netFx20-setup-bundle-x ...

  7. 【Android自动化】Subprocess.check_output()简单用法

    # -*- coding:utf-8 -*- import os import sys import subprocess from uiautomator import device as d cm ...

  8. [eclipse]添加python默认模板,在首行添加编码方式(# -*- coding: utf-8 -*-)

    1.从eclipse的windows->preference 2.参照如下图,添加指定的utf-8编码方式

  9. Spring-IOC RootBeanDefinition源码分析

    GenericBeanDefinition是一站式的标准bean definition,除了具有指定类.可选的构造参数值和属性参数这些其它bean definition一样的特性外,它还具有通过par ...

  10. Java之时间转换

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse( ...