设计模式之单例模式(Singleton)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。
创建型模式包括:1、FactoryMethod(工厂方法模式);2、Abstract Factory(抽象工厂模式);3、Singleton(单例模式);4、Builder(建造者模式);5、Prototype(原型模式).
结构型模式包括:6、Bridge(桥接模式);7、Adapter(适配器模式);8、Decorator(装饰模式);9、Composite(组合模式);10、Flyweight(享元模式);11、Facade(外观模式);12、Proxy(代理模式).
行为模式包括:13、TemplateMethod(模板方法模式);14、Strategy(策略模式);15、State(状态模式);16、Observer(观察者模式);17、Memento(备忘录模式);18、Mediator(中介者模式);19、Command(命令模式);20、Visitor(访问者模式);21、Chain of Responsibility(责任链模式);22、Iterator(迭代器模式);23、Interpreter(解释器模式).
Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Builder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Prototype:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
Bridge:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Adapter:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, Decorator模式比生成子类方式更为灵活。
Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。
Flyweight:运用共享技术有效地支持大量细粒度的对象。
Facade:为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Proxy:为其他对象提供一个代理以控制对这个对象的访问。
Template Method:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Strategy:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
Memento:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
Visitor:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
Iterator:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
Interpreter:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。
Singleton:(1)、意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点;(2)、适用性:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时;当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时;(3)、优点:A、对唯一实例的受控访问:因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它;B、缩小名空间:Singleton模式是对全局变量的一种改进,它避免了那些存储唯一实例的全局变量污染名空间;C、允许对操作和表示的精化:Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的,你可以用你所需要的类的实例在运行时刻配置应用;D、允许可变数目的实例:这个模式使得你易于改变你的想法,并允许Singleton类的多个实例。此外,你可以用相同的方法来控制应用所使用的实例的数目。只有允许访问Singleton实例的操作需要改变;E、比类操作更灵活:另一种封装Singleton功能的方式是使用类操作(即C++中的静态成员函数或者是Smalltalk中的类方法)。但这两种语言技术都难以改变设计以允许一个类有多个实例。此外,C++中的静态成员函数不是虚函数,因此子类不能多态的重定义它们。
示例代码1:
#include <iostream>
#include <string>
#include <vector>using namespace std;class Singleton
{
private:Singleton() {}static Singleton* single;public:static Singleton* GetInstance(){if (single == NULL) {single = new Singleton();}return single;}
};Singleton* Singleton::single = NULL;//静态变量类外初始化//客户端
int main()
{Singleton* s1 = Singleton::GetInstance();Singleton* s2 = Singleton::GetInstance();if (s1 == s2) cout<<"ok"<<endl;elsecout<<"no"<<endl;/*result:ok*/return 0;
}
示例代码2:
Singleton.h:
#ifndef _SINGLETON_H_
#define _SINGLETON_H_#include <iostream>
using namespace std;class Singleton
{
public:static Singleton* Instance();
protected:Singleton();//Singleton不可以被实例化,因此将其构造函数声明为protected或者直接声明为private
private:static Singleton* _instance;
};#endif//~_SINGLETON_H_
Singleton.cpp:
#include "Singleton.h"#include <iostream>
using namespace std;Singleton* Singleton::_instance = 0;Singleton::Singleton()
{cout<<"Singleton ..."<<endl;
}Singleton* Singleton::Instance()
{if (_instance == 0) _instance = new Singleton();return _instance;
}
main.cpp:
#include "Singleton.h"#include <iostream>
using namespace std;int main()
{Singleton* sgn = Singleton::Instance();/*result:Singleton ...*/return 0;
}
单例模式结构图:
参考文献:
1、《大话设计模式C++》
2、《设计模式精解----GoF23种设计模式解析》
3、《设计模式----可复用面向对象软件的基础》
设计模式之单例模式(Singleton)摘录相关推荐
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- 设计模式之——单例模式(Singleton)的常见应用场景(转):
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...
- Java设计模式之单例模式(Singleton Pattern)
**单例模式:用来创造独一无二的,只能有一个实例的对象设计模式.单例模式确保一个类只有一个实例,并提供一个全局访问点.**相比于全局变量(对对象的静态引用),单例模式可以延迟实例化,而且全局变量不能保 ...
- 【设计模式】单例模式 Singleton Pattern
通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance) 的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...
- Android设计模式——单例模式(Singleton)
二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元 ...
- 设计模式(21):创建型-单例模式(Singleton)
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- python3中的单例模式Singleton
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-01-21 09:09:09 # @Author : cdl (1217096 ...
- android开发常用的设计模式,android开发设计模式之——单例模式详解
单例模式是设计模式中最常见也最简单的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到.比如在Android实际APP 开发中用到的 账号信息对象管理, 数据库对象(SQLiteOpenH ...
- Java 设计模式之单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对 ...
最新文章
- 简单分析Flask 数据库迁移详情
- 动态规划 dp04 凸n边形的三角形划分 c代码
- MySQL Group Replication 介绍
- 01json转字符串
- Dirichlet Process 和 Dirichlet Process Mixture模型
- Spring生态系统(Spring可能大家都在用,很少去关注整体架构)
- 2020杭电多校赛 Multi-University Training Contest
- 前端工程师的价值体现在哪里?
- 短信后台功能与通道路由模块客户通道选择短信平台开发|国际短信通道短信后台源码
- 菜鸟和计算机高手的差别
- 实测榛子云短信平台短信接收速度
- 学会了C语言究竟能干什么呢?
- arm linux ota,嵌入式Linux的OTA更新,现有更新系统的比较
- shadow:人工智能设计,一门自己生长的课
- 【python】在图片上绘画
- 怎样做 SEO,具体的计划是什么?
- Matplotlib——散点图_多种自定义
- 烤仔星选·NFT实验室 | 展望2021:是否是NFT爆发元年?
- 调剂云南师范大学计算机专硕,云南师范大学2018年硕士研究生调剂公告
- STM32——FSMC(灵活的静态存储器控制器)驱动TFTLCD液晶屏
热门文章
- C++读取文件名,过滤文件路径及后缀
- db2删除大量数据_Python 连接数据库的多种方法
- 最新开源LiDAR数据集LSOOD:四种常见的室外物体分类
- 常见浏览器User-Agent大全
- ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course
- LTE-连接态下的DRX
- 记一次shell脚本推后台stopped的问题
- C# 篇基础知识11——泛型和集合
- 常用图像额文件格式及类型
- GDC2016 Epic Games【Bullet Train】 新风格的VR-FPS的制作方法