• flyweight模式


      1 #include <iostream>
      2 #include <map>
      3 #include <string>
      4 #include <cstring>
      5 #include <string.h>
      6 #include <cstdlib>
      7 using namespace std;
      8 
      9 class Book {
     10 public:
     11     string GetPublish() {
     12         return *m_publishCompany;
     13     }
     14     string GetWriter() {
     15         return *m_writer;
     16     }
     17     int GetBookID() {
     18         return m_bookID;
     19     }
     20     int GetPrice() {
     21         return m_price;
     22     }
     23     string GetName() {
     24         return m_name;
     25     }
     26 
     27     void SetPublish(string *s) {
     28         m_publishCompany = s;
     29     }
     30     void SetWriter(string *s) {
     31         m_writer = s;
     32     }
     33     void SetBookID(int id) {
     34         m_bookID = id;
     35     }
     36     void SetPrice(int price) {
     37         m_price = price;
     38     }
     39     void SetName(string s) {
     40         m_name = s;
     41     }
     42 
     43 private:
     44     string *m_publishCompany; // 出版社
     45     string *m_writer; // 作者
     46     int m_bookID; // 书籍编号
     47     int m_price; // 价钱
     48     string m_name; // 书名
     49 };
     50 
     51 class PublishFlyweight {
     52 public:
     53     PublishFlyweight(string s) {
     54         m_name = s;
     55     }
     56     string* GetName() {
     57         return &m_name;
     58     }
     59 
     60 private:
     61     string m_name;
     62 };
     63 
     64 class PublishFlyweightFactory {
     65 public:
     66     PublishFlyweight* GetPublish(string key) {
     67         PublishFlyweight *p;
     68         map<string, PublishFlyweight*>::iterator it;
     69         it = mapPublish.find(key);
     70 
     71         // 存在这个出版社
     72         if (it != mapPublish.end()) {
     73             // 这里可能有点难懂,请查阅STL的帮助文档
     74             // 其实second就是指 map<string, PublishFlyweight*> 的 PublishFlyweight*
     75             p = (*it).second;
     76             cout << "已经有这个出版社: " << *(p->GetName()) << " 你节省了" << strlen((*(p->GetName())).c_str()) << "字节的空间" << endl;
     77         }
     78 
     79         else { // 插入这个PublishFlyweight
     80 
     81             p = new PublishFlyweight(key);
     82             mapPublish[key] = p;
     83         }
     84 
     85         return p;
     86     }
     87 
     88 private:
     89     map<string, PublishFlyweight*> mapPublish;
     90 };
     91 
     92 class WriterFlyweight {
     93 public:
     94     WriterFlyweight(string s) {
     95         m_name = s;
     96     }
     97     string* GetName() {
     98         return &m_name;
     99     }
    100 
    101 private:
    102     string m_name;
    103 };
    104 
    105 class WriterFlyweightFactory {
    106 public:
    107     WriterFlyweight* GetWriter(string key) {
    108         WriterFlyweight *p;
    109         map<string, WriterFlyweight*>::iterator it;
    110         it = mapWriter.find(key);
    111 
    112         // 存在这个Writer
    113         if (it != mapWriter.end()) {
    114             // 这里可能有点难懂,请查阅STL的帮助文档
    115             // 其实second就是指 map<string, WriterFlyweight*> 的 WriterFlyweight*
    116             p = (*it).second;
    117             cout << "已经有这个作者名字: " << *(p->GetName()) << " 你节省了"
    118                     << strlen((*(p->GetName())).c_str()) << "字节的空间" << endl;
    119         }
    120 
    121         else { // 插入这个PublishFlyweight
    122 
    123             p = new WriterFlyweight(key);
    124             mapWriter[key] = p;
    125         }
    126 
    127         return p;
    128     }
    129 
    130 private:
    131     map<string, WriterFlyweight*> mapWriter;
    132 };
    133 
    134 void ShowBookInfo(Book book) {
    135     cout << "书名:" << book.GetName() << endl;
    136     cout << "编号:" << book.GetBookID() << endl;
    137     cout << "价钱:" << book.GetPrice() << endl;
    138     cout << "出版:" << book.GetPublish() << endl;
    139     cout << "作者:" << book.GetWriter() << endl;
    140     cout << endl;
    141 }
    142 
    143 int main() {
    144     PublishFlyweightFactory pff;
    145     WriterFlyweightFactory wff;
    146     Book book1, book2, book3;
    147 
    148     book1.SetPublish(pff.GetPublish("机械工业出版社")->GetName());
    149     book1.SetWriter((wff.GetWriter("候捷")->GetName()));
    150     book1.SetBookID(0000);
    151     book1.SetPrice(20);
    152     book1.SetName(string("<<C++好野>>"));
    153 
    154     ShowBookInfo(book1);
    155 
    156     book2.SetPublish((pff.GetPublish("人民邮电出版社")->GetName()));
    157     book2.SetWriter((wff.GetWriter("候捷")->GetName()));
    158     book2.SetBookID(0001);
    159     book2.SetPrice(30);
    160     book2.SetName(string("<<C++是好劲>>"));
    161 
    162     ShowBookInfo(book2);
    163 
    164     book3.SetPublish((pff.GetPublish("机械工业出版社")->GetName()));
    165     book3.SetWriter((wff.GetWriter("一雨田")->GetName()));
    166     book3.SetBookID(0002);
    167     book3.SetPrice(50);
    168     book3.SetName(string("<<C++无得顶,我是铁头功...>>"));
    169 
    170     ShowBookInfo(book3);
    171     return 0;
    172 }
  • 相关阅读:
    dojo/Deferred类和dojo/promise类的使用
    dojo中类的继承
    c# 委托
    使用Spring Data JPA报错:javax.persistence.TransactionRequiredException: Executing an update/delete query
    服务器重启后,Docker安装的mysql怎么重启?
    IDEA开启Run Dashboard的配置
    Java中List集合去重的几种方式
    关闭迅雷更新到新版本的提示
    XMind8 破解激活教程(win系统)
    连接Oracle报错 ORA-12638: 身份证明检索失败
  • 原文地址:https://www.cnblogs.com/kakamilan/p/2604540.html
Copyright © 2020-2023  润新知