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 }

原文链接: https://www.cnblogs.com/kakamilan/archive/2012/07/23/2604540.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/56385

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午7:17
下一篇 2023年2月9日 上午7:19

相关推荐