首页 > 其他分享 >设计模式-享元模式

设计模式-享元模式

时间:2023-09-24 21:47:04浏览次数:39  
标签:享元 pointSize string int character 模式 height 设计模式

享元模式

模式定义

  • 运用共享技术有效的支持大量颗粒度的对象

模式动机

  1. 如果一个应用使用了大量的对象,而大量的对象造成了很大的存储开销时就应该考虑使用
  2. 当对象的大多数状态为外部状态,如果删除对象的外部状态,那么可以用相对较少的共享内存对象取代很多组对象,此时可以考虑使用享元模式。

UML 类图

优缺点

优点

  1. 享元模式可以避免大量非常类似的开销。在有些程序中,有时候需要生成大量的细颗粒度的类实例来表示数据,如果他们仅个别参数不同外,就可以使用该模式将不同的参数移到类实例外来,在方法调用的时候将参数传入,这样就可以大幅度地减少单个实例的数目

缺点

  1. 使用享元模式需要维护一个系统已有的所有享元的列表,而这本身需要耗费资源
  2. 享元模式使得系统变得更加复杂,为了使对象可以共享,需要将一些状态外部化,这使得程序逻辑复杂化。因此应当在足够多的对象实例可供共享时才值得使用享元模式

源码

/**
 * 享元模式:通过共享技术有效地支持大量颗粒细度的对象
*/

#include <string>
#include <iostream>
#include <vector>

using namespace std;

class FlyWeight
{
public:
    virtual void Operation(const string& extrinsicState) = 0;
    string getIntrinsicState(){
        return m_intrinsicState;
    }
    virtual ~FlyWeight(){}
protected:
    FlyWeight(string intrinsicState){
        m_intrinsicState = intrinsicState;
    }
private:
    string m_intrinsicState;
};

class UnsharedConcreteFlyWeight : public FlyWeight
{
public:
    virtual void Operation(const string& extrinsicState){
        cout << extrinsicState << endl;
    }
    UnsharedConcreteFlyWeight(string intrinsicState):FlyWeight(intrinsicState){

    }
    ~UnsharedConcreteFlyWeight(){}
private:

};

class ConcreteFlyweight : public FlyWeight
{
public:
    virtual void Operation(const string& extrinsicState){
        cout << getIntrinsicState() << endl;
        cout << extrinsicState << endl;
    }
    ConcreteFlyweight(string intrisicState):FlyWeight(intrisicState){
        
    }
    ~ConcreteFlyweight(){}
private:

};

class FlyWeightFactory
{
public:
    FlyWeightFactory(){}
    ~FlyWeightFactory(){}
    FlyWeight* getFlyWeight(string key){
        vector<FlyWeight*>::iterator it = m_vecPFlyWeight.begin();
        for(; it != m_vecPFlyWeight.end(); ++it){
            if((*it)->getIntrinsicState() == key){
                return *it;
            }
        }

        FlyWeight* p_struFly = new ConcreteFlyweight(key);
        m_vecPFlyWeight.push_back(p_struFly);
        return p_struFly;
    }
    void getFlyWeightCount(){
        cout << m_vecPFlyWeight.size() << endl;
    }
private:
    vector<FlyWeight*> m_vecPFlyWeight;
};

class character
{
public:
    virtual ~character(){}
    virtual void display(int width, int height, int ascent, int descent, int pointSize) = 0;
    virtual char getSymbol() = 0;
protected:
    char m_symbol;
    int m_width;
    int m_height;
    int m_ascent;
    int m_descent;
    int m_pointSize;

    character(char c){
        m_symbol = c;
    }
};

class characterA : public character
{
public:
    characterA(char c):character(c){}
    ~characterA(){}
    virtual void display(int width, int height, int ascent, int descent, int pointSize){
        m_ascent = ascent;
        m_height = height;
        m_width = width;
        m_pointSize = pointSize;
        m_descent = descent;

        cout << m_symbol << " " << m_ascent << " " << m_descent << " " << m_height << " " << m_pointSize << " " << m_width << endl;
    }
    virtual char getSymbol(){
        return m_symbol;
    }
};

#if 0
class characterB : public character
{
public:
    characterB(char c):character(c){}
    ~characterB(){}
    virtual void display(int width, int height, int ascent, int descent, int pointSize);
    virtual char getSymbol(){
        return m_symbol;
    }
};

class characterC : public character
{
public:
    characterC(char c);
    ~characterC();
    virtual void display(int width, int height, int ascent, int descent, int pointSize);
    virtual char getSymbol();
};

class characterD : public character
{
public:
    characterD(char c);
    ~characterD();
    virtual void display(int width, int height, int ascent, int descent, int pointSize);
    virtual char getSymbol();
};
#endif

class characterFactory
{
public:
    characterFactory(){}
    ~characterFactory(){}
    character* getCharacter(char c){
        vector<character*>::iterator iter = m_vecCharacter.begin();
        for(; iter != m_vecCharacter.end(); ++iter){
            if((*iter)->getSymbol() == c) {
                return *iter;
            }
        }

        character* p_F = new characterA(c);
        m_vecCharacter.push_back(p_F);
        return p_F;

    }
    vector<character*>::size_type getCount(){
        return m_vecCharacter.size();
    }
private:
    vector<character*> m_vecCharacter;
};

int main()
{
    #if 0
    string extrinsicState = "ext";
    FlyWeightFactory* p_struFlyWeightFac = new FlyWeightFactory();
    FlyWeight* p_struFlyWeight = p_struFlyWeightFac->getFlyWeight("hello");
    // FlyWeight* p_struFlyWeight1 = p_struFlyWeightFac->getFlyWeight("hello");

    p_struFlyWeight->Operation(extrinsicState);

    p_struFlyWeightFac->getFlyWeightCount();

    #endif

    int ascent = 70;
    int descent = 0;
    int height = 100;
    int width = 120;
    int pointSize = 10;

    string test = "AABCDEEFGHO";
    string::iterator it = test.begin();
    characterFactory* pcF = new characterFactory();
    for (; it != test.end(); ++it)
    {
        pointSize++;
        char c = *it;
        character* p_charF = pcF->getCharacter(c);
        p_charF->display(width,height,ascent,descent,pointSize);
    }

    vector<character*>::size_type sizeChar = pcF->getCount();
    cout << "count: " << sizeChar << endl;

    return 0;
}

标签:享元,pointSize,string,int,character,模式,height,设计模式
From: https://www.cnblogs.com/wanghao-boke/p/17726729.html

相关文章

  • 工厂模式的三种姿态?
    在软件工程中常见的设计模式——工厂模式。工厂模式是一种有力的工具,用于创建对象实例的方式,可以帮助我们更好地组织代码和降低耦合性。在本文中,我将为大家详细介绍工厂模式的三种姿态,同时通过举例和代码演示来帮助大家更好地理解。工厂模式的三种姿态工厂模式是一种创建型设计模......
  • 工厂方法模式
    工厂方法模式总体代码//MySpider.h#pragmaMySpider.honce#include<memory>usingnamespacestd;classMySpider{public: virtualvoidCrawl()=0;};classMySpiderFactory{public: virtualshared_ptr<MySpider>CreateMySpider()=0;};//MyTextIma......
  • 单例模式(正式)
    当需要严格控制一个类在全局只有唯一一个实例,并且可以随时调用它的时候,就可以使用单例模式。单例模式可以以实例化时间分为懒汉式和饿汉式、以C实现方式分为C++98的实现以及C++11的实现。懒汉式c++11classSingleton{public:staticSingleton*getInstance(){ i......
  • 建造者模式
    建造者模式动机将一个复杂对象的创建过程及其表示分离,同一个创建过程可以创建不同的表示当需要创建一个包含多个部分或配置选项的复杂对象,并且需要将构建过程与表示分离时,建造者模式很有用帮助你灵活地构建不同配置的对象,同时保持构建过程的清晰性和可维护性经典Builder模......
  • 工厂模式(正式)
    抽象工厂模式及示例模式的动机提供一种接口,用于创建一系列相关或相互依赖的对象抽象工厂模式通过引入抽象工厂接口,允许客户端代码通过工厂接口创建产品,而不需要关心具体的产品类;使得客户端代码可以与特定产品的具体类解耦,实现了抽象和实现的分离模式的实现抽象的......
  • Kibana数据索引模式设计策略案例
    前言Kibana是一个非常流行的数据可视化工具,它可以帮助我们快速地对数据进行分析和展示。在使用Kibana的过程中,数据索引模式的设计非常重要,它直接影响到我们对数据的查询和分析效率。本文将介绍一些Kibana数据索引模式设计的策略案例,希望能够帮助大家更好地使用Kibana。策略一:尽量......
  • 代理模式
    工作场景:让用户根据接口查询系统各资源占用率优化用户性能传统代码:传统代码//main.cpp#include<iostream>#include"ServerInfoGetter.h"#include<chrono>#include<thread>intmain(){ ServerInfoGettergetter; ServerInfoinfo=getter.getInfo(); whil......
  • Redis搭建哨兵模式架构
    使用Docker安装因为配置太复杂,所以这里我们使用dockercompose来一键部署不使用内部网络搭建编写redis主从docker-compose.ymlversion:'3'services:master:image:rediscontainer_name:redis-masterrestart:alwayscommand:redis-server--requi......
  • 工厂模式
    工作场景:编写一个给用户发送短信的程序传统写法#include<stdio.h>#include<string>enumNotifMessageType{WUDI,FEITIAN};classNotifMessage{public:intsendMessage(longlonguserId,std::string&msg,NotifMessageTypetype){s......
  • 模式
    模式2.7.1.1、模式的定义定义模式实际上定义了一个命名空间,在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等。在CREATESCHEMA中可以接受CREATETABLE,CREATEVIEW和GRANT子句。CREATESCHEMA<模式名>AUTHORIZATION<用户名>[<表定义子句>|<视图定义子句>|<......