zoukankan      html  css  js  c++  java
  • 享元模式

    一、简介

    1、享元模式运用共享技术有效地支持大量细粒度的对象。

    2、享元模式是为了减少同种类的实例化,以达到节省内存的目的。

    3、类成员函数

    抽象享元类(Flyweight

    它是所有具体享元类的超类。为这些类规定出需要实现的公共接口,那些需要外蕴状态(Exte的操作可以通过方法的参数传入。抽象享元的接口使得享元变得可能,但是并不强制子类实行共享,因此并非所有的享元对象都是可以共享的。

    具体享元类(ConcreteFlyweight)

    具体享元类实现了抽象享元类所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。有时候具体享元类又称为单纯具体享元类,因为复合享元类是由单纯具体享元角色通过复合而成的。

    不能共享的具体享元类(UnsharableFlyweight)

    不能共享的享元类,又叫做复合享元类。一个复合享元对象是由多个单享元对象组成,这些组成的对象是可以共享的,但是复合享元类本身并不能共享。

    享元工厂类(FlyweightFactoiy)

    享元工厂类负责创建和管理享元对象。当一个客户端对象请求一个享元对象的时候,享元工厂需要检查系统中是否已经有一个符合要求的享元对象,如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有适当的享元对象的话,享元工厂角色就应当创建一个新的合适的享元对象。

    4、UML

    5、所属类别:结构型

    二、C++程序

     1 // 享元模式.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include<iostream>
     6 #include<string>
     7 #include<map>
     8 using namespace std;
     9 class Website
    10 {
    11 public:
    12     Website(){}
    13     virtual ~Website(){}
    14     virtual void show()=0;
    15 };
    16 class Concretewebsite :public Website
    17 {
    18 private:
    19     string name;
    20 public:
    21     Concretewebsite(string n):name(n){}
    22     virtual ~Concretewebsite(){}
    23     virtual void show()
    24     {
    25         cout<<name<<endl;
    26     }
    27 };
    28 class Websitefactory
    29 {
    30 private:
    31     //创建一个map,类似于哈希表,这里也可以用哈希表
    32     map<string,Concretewebsite *> websites;
    33 public:
    34     Websitefactory(){}
    35     ~Websitefactory(){}
    36     //获得网站,如果该类型的网站已经被创建过,则返回已经创建的网站,否则新创建一个
    37     Concretewebsite* getwebsite(string key)
    38     {
    39         if(websites[key]==NULL)
    40         {
    41             websites[key]=new Concretewebsite(key);
    42         }
    43         return websites[key];
    44     }
    45     //返回实际创建网站的个数,即hash表中元素的个数
    46     int cout()
    47     {
    48         return  websites.size();
    49     }
    50 };
    51 int _tmain(int argc, _TCHAR* argv[])
    52 {
    53     Websitefactory* websitefactory=new Websitefactory();
    54     Concretewebsite * weixin1=websitefactory->getwebsite("微信营销");
    55     weixin1->show();
    56 
    57     Concretewebsite * weixin2=websitefactory->getwebsite("微信营销");
    58     weixin2->show();
    59 
    60     Concretewebsite * weibo1=websitefactory->getwebsite("微博营销");
    61     weibo1->show();
    62 
    63     cout<<websitefactory->cout()<<endl;
    64     return 0;
    65 }

    程序中使用了,三个营销,但是有只有两个种类,使用享元模式只实例化两个对象

  • 相关阅读:
    C 语言中的 fgets()
    C++ 中的 C_str() 函数用法
    Ubuntu 下使用 sshfs 挂载远程目录到本地
    VirtualBox 下主机与虚拟机以及虚拟机之间互通信配置
    转:sudo 的常见用法和参数选项
    “a++” 与 “++a” 的区别
    Linux 下运行 C++ 程序出现 “段错误(核心已转储)”
    vector容器中添加和删除元素
    NCCloud 指令示例
    c++ find函数用法
  • 原文地址:https://www.cnblogs.com/bewolf/p/4265232.html
Copyright © 2011-2022 走看看