C++设计模式 之 “对象性能” 模式:Singleton、Flyweight
“对象性能”模式
面向对象很好地解决了“抽象”的问题,但是必不可免地要付出一定的代价。对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。
典型模式
# Singleton
# Flyweight
Part 1 单件模式(单例模式)
动机
#在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保他们的逻辑正确性、以及良好的效率。
#如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
#这应该是类设计者的责任,而不是使用者的责任。
模式定义
保证一个类仅有一个实例,并提供一个该实例的全局访问点。——《设计模式》GoF
代码
class Singleton
{
private static Singleton instance;
private static readonly object syncRoot = new object(); public static Singleton GetInstance()
{
if(instance == null)
{
lock (syncRoot)
{
if(instance == null)
instance = new Singleton();
}
} return instance;
} private static Singleton instance() {}
}
结构
要点总结
# Singleton 模式中的实例构造器可以设置为 protected 以允许子类派生。
# Singleton 模式一般不要支持拷贝构造函数和 Clone 接口,因为这有可能导致多个对象实例,与 Singleton 模式的初衷违背。
#如何实现多线程环境下安全的 Singleton ? 注意对双检查锁的正确实现。
part2 Flyweight 享元模式
动机
#在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行代价——主要指内存需求方面的代价。
#如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作?
模式定义
运用共享技术有效地支持大量细粒度的对象。——《设计模式》GoF
结构
代码 from 《大话设计模式》
struct User {
User(string username) : _username(username) {}
string _username;
}; struct Website {
virtual void request(User* u) = 0;
}; struct ConcreteWebsite : public Website {
virtual void request(User* u) override {
cout << u->_username << endl;
}
}; struct WebsiteFactory {
map<string, Website*> websites; Website* getWebsiteCategory(string key) { map<string, Website*>::const_iterator it = websites.find(key); if (it != websites.end())
return it->second;
else
return websites[key] = new ConcreteWebsite();
}
}; int main() {
WebsiteFactory websiteFactory; Website* youku = websiteFactory.getWebsiteCategory("concrete_session");
youku->request(new User("Tank")); return 0;
}
要点总结
#面向对象很好地解决了抽象性的问题,但是作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。Flyweight主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。
#Flyweight采用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。在具体实现方面,要注意对象状态的处理。
#对象的数量太大从而导致对象内存开销加大——什么样的数量才算大?这需要我们仔细地根据具体应用情况进行评估,而不能凭空臆断。
C++设计模式 之 “对象性能” 模式:Singleton、Flyweight的更多相关文章
- 23种设计模式 - 对象性能(Singleton - Flyweight享元)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 对象性能 面向对象很好地解决了"抽象"的问题,但是必不可免地付出一定的代价.对于通常情 ...
- 设计模式---对象性能模式之单例模式(Singleton)
前提:“对象性能”模式 面向对象很好的解决了“抽象”的问题,但是必不可免地要付出一定的代价.对于通常情况来讲,面向对象的成本大都可以忽略不计.但是某些情况,面向对象所带来的成本必须谨慎处理. 前面是 ...
- 学习记录:《C++设计模式——李建忠主讲》5.“对象性能”模式
对象性能模式:面向对象很好地解决了抽象地问题,但是必不可免地要付出一定地代价.对于通常情况来讲,面向对象地成本大都可以忽略不计,但某些情况,面向对象所带来地成本必须谨慎处理. 典型模式:单件模式(Si ...
- 8.2 GOF设计模式一: 单实例模式 SingleTon
GOF设计模式一: 单实例模式 SingleTon 整个美国,只有一个“现任美国总统” 比如,在学校,“老师”,有数百个:“校长”,只有一个 系统运行时,如何保证某个类只允许实例化一个对象 ...
- C#设计模式:享元模式(Flyweight Pattern)
一,什么是享元模式? 享元模式(Flyweight Pattern):采用共享技术来避免大量拥有相同内容对象的开销,主要用于减少创建对象的数量,以减少内存占用和提高性能 1,根本的思路就是对象的重用2 ...
- 23种设计模式之享元模式(FlyWeight)
享元模式是一种对象结构型模式,通过运用共享技术,有效地支持大量细粒度的对象.系统只使用少量的对象,而这些对象都很相似,状态变化很小,对象使用次数增多.享元对象能做到共享的关键是区分内部状态和外部状态. ...
- C++设计模式 之 “对象创建”模式:Factory Method、Abstract Factory、Prototype、Builder
part 0 “对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fact ...
- GoLang设计模式06 - 对象池模式
这次介绍最后一个创建型模式--对象池模式.顾名思义,对象池模式就是预先初始化创建好多个对象,并将之保存在一个池子里.当需要的时候,客户端就可以从池子里申请一个对象使用,使用完以后再将之放回到池子里.池 ...
- php设计模式 数据对象映射模式
数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作. 在代码中实现数据对象映射模式,实现一个ORM类,将复杂的sql语句映射成对象属性的操作.对象关系映射(Obje ...
随机推荐
- java 中形参与实参的转换
java中有两个参数,一个是形参,一个是实参. 形参:在函数定义中,整个函数体内部都可以使用,离开了该函数就不能继续使用. 实参:出现在主函数中,进入被调函数后,实参变量也就不能继续使用. publi ...
- oracle11gR2 win7_32位客户端连接虚拟机中oracle11gR2 win7_32位服务器方法
改写服务器中的监听文件(listener.ora和tnsnames.ora) “ora-12541:TNS:无监听程序”问题的解决 ora-12541:TNS:无监听程序,出现这种错误的时候,可以尝试 ...
- 数据库管理系统的ACID特性
数据库管理系统(DBMS)的事务都遵循着四种标准规格的约定.将这四种特性的首字母结合起来就统称为ACID特性.这些约定是所有DBMS都必须遵守的规则. 原子性 原子性是指在事务结束时,其中所包含的更新 ...
- range() 与 np.arange()
转自:http://blog.csdn.net/lanchunhui/article/details/49493633 range()返回的是range object,而np.nrange()返回的是 ...
- Maven中的pom.xml配置文件详解
原文:http://blog.csdn.net/u012152619/article/details/51485297 <project xmlns="http://maven.apa ...
- IO流(8)递归删除带文件的目录
递归删除带内容的目录 * * 目录给定:demo * * 分析: * A:封装目录 * B:获取该目录下的所有文件或者文件夹的File数组 * C:遍历该File数组,得到每一个File对象 * D: ...
- 【Python】【web.py】python web py入门-4-请求处理(上)
python web py入门-4-请求处理(上) 2017年09月05日 23:07:24 Anthony_tester 阅读数:2907 标签: webpy入门请求处理 更多 个人分类: Pyth ...
- mysql 权限管理介绍
mysql权限管理 就是对控制用户对库.对表的权限.对表中字段权限 权限管理分步 1.创建账号 创建账号有本地账号和远程账号 本地账号 本地账号只能在mysql服务端机器做操作 '; # mysql ...
- vue-页面回退
<template> <div> <button @click="goback">我是Home01</button> </di ...
- 杀死正在运行的进程: linux
1:杀死正在运行的进程:使用ps -aux|grep labor 查出进程PID 2:使用kill PID 将进程杀死.