c++ 設計模式概述之享元
阿新 • • 發佈:2020-08-12
類寫的不夠規範,目的是為了縮短篇幅,實際中其不要這樣做。
參考文章:
1、http://c.biancheng.net/view/1371.html
1、概述
A、享元,我的理解是: 共享的模組單元。實現的是複用程式碼。
B、非享元,非享元型別要作為享元的介面的引數。
2.、模式的結構
享元模式的主要角色有如下。
A、 抽象享元角色(Flyweight):是所有的具體享元類的基類,為具體享元規範需要實現的公共介面,非享元的外部狀態以引數的形式通過方法傳入。
B、 具體享元(Concrete Flyweight)角色:實現抽象享元角色中所規定的介面。
C、 非享元(Unsharable Flyweight)角色:是不可以共享的外部狀態,它以引數的形式注入具體享元的相關方法中。
3、範例
例如: 需要接受組播資料,組播ip相同,埠不同。收到的資料單獨處理。
4、抽象享元角色
// 抽象共享單元 class fw_adress { public: virtual void operation(unshared_unit port) = 0; };
5、具體享元
// 具體共享角色 class fly_weight_mine : publicfw_adress { public: fly_weight_mine(std::string str_ip) { _udp_cast_ip = str_ip; cout << "\n 具體共享IP【 " << str_ip.c_str() << " 】被建立\n"; } void operation(unshared_unit port) { cout << "\n 具體共享IP【 " << _udp_cast_ip.c_str() << "】被呼叫, "; cout << "非共享埠=" << port.get_port() <<"\n"; } private: std::string _udp_cast_ip; };
6、非共享元
// 非共享模組 class unshared_unit { public: unshared_unit(int port) { _port = port; } int get_port() { return _port; } private: int _port; };
7、享元工廠
工廠負責建立物件,用map維護了一個物件集
// 享元工廠,負責生產對應的物件 class flyweight_factory { public: // 釋放資源 virtual ~flyweight_factory() { for each(auto index in _map_adress) { if (index.second) { cout << "\n 正在釋放物件 = " << index.first.c_str(); delete index.second; } } } // 工廠負責建立對應的物件 fw_adress* get_element(std::string str_ip) { fw_adress* pret_val = nullptr; std::map<std::string, fw_adress* > :: iterator& it = _map_adress.find(str_ip); // 1、 找到了, 說明已經建立,就返回已經建立的物件 if (_map_adress.end() != it) { pret_val = it->second; cout << "已經找到【 " << str_ip.c_str() << " 】,放回已經建立的物件\n"; } // 2、 沒有找到,就建立 else { pret_val = new fly_weight_mine(str_ip); // 2.1 建立失敗 if (nullptr == pret_val) cout << "\n\n 建立失敗, str_ip = " << str_ip.c_str() << endl; // 2.2 建立成功 else _map_adress.insert(make_pair(str_ip, pret_val)); } return pret_val; } private: // 維護物件使用,提高記憶體使用效率 std::map<std::string, fw_adress *> _map_adress; };
8、呼叫
void call_fly_weight() { std::unique_ptr<flyweight_factory> pfact(new flyweight_factory); if (!pfact) { cout << "\n\n 享元 工廠建立失敗"; return; } // 內部管理,無需外界釋放 // 組播IP std::string str_udp1("233.100.100.199"); std::string str_udp2("233.100.100.200"); // 組播埠 unshared_unit us1(10086); unshared_unit us2(10087); unshared_unit us3(10088); unshared_unit us4(10089); unshared_unit us5(20086); cout << "\n 1、下面開始建立物件:\n"; fw_adress *fw1 = pfact->get_element(str_udp1); fw_adress *fw2 = pfact->get_element(str_udp1); fw_adress *fw3 = pfact->get_element(str_udp1); fw_adress *fw11 = pfact->get_element(str_udp2); fw_adress *fw12 = pfact->get_element(str_udp2); cout << "\n\n 2、物件建立完畢,下面開始呼叫非享元模組\n"; if (fw1) fw1->operation(us1); if (fw2) fw2->operation(us2); if (fw3) fw3->operation(us3); if (fw11) fw11->operation(us4); if (fw12) fw12->operation(us5); }
9、輸出結果: