From 2d60f640eb526ba94ecf0355709e1655beb77ab7 Mon Sep 17 00:00:00 2001 From: Ian Dinwoodie Date: Mon, 29 Apr 2019 20:26:55 -0400 Subject: [PATCH] Added flyweight example. --- README.md | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index af2749d..87adca1 100644 --- a/README.md +++ b/README.md @@ -1489,7 +1489,102 @@ repeated representation would use an unacceptable amount of memory. #### Programmatic Example -TODO +Translating our tea example from above. First of all we have tea types and tea +maker + +```cpp +class Tea +{ + public: + typedef std::shared_ptr ptr_t; +}; + +class TeaMaker +{ + public: + typedef std::shared_ptr ptr_t; + + Tea::ptr_t make(const std::string& preference) + { + auto match = availableTea_.find(preference); + if (match == availableTea_.end()) { + availableTea_[preference] = std::make_shared(); + } + + return availableTea_[preference]; + } + + int getPreferenceCount(void) + { + return availableTea_.size(); + } + + private: + std::unordered_map availableTea_; +}; +``` + +Then we have the tea shop which takes orders and serves them + +```cpp +class TeaShop +{ + public: + TeaShop(TeaMaker::ptr_t maker) + : maker_(maker) + { + } + + void takeOrder(const std::string& preference, int table) + { + orders_[table] = maker_->make(preference); + } + + void serve(void) + { + for (auto order : orders_) { + std::cout << "Serving tea to table " << order.first << std::endl; + } + } + + int getPreferenceCount(void) + { + return maker_->getPreferenceCount(); + } + + private: + TeaMaker::ptr_t maker_; + std::unordered_map orders_; +}; +``` + +Here is how this can be used: + +```cpp +TeaMaker::ptr_t maker = std::make_shared(); +TeaShop shop(maker); + +// No orders have been taken, so there are no available teas. +std::cout << shop.getPreferenceCount() << std::endl; // Output: 0 + +// Take some orders. +shop.takeOrder("half sugar", 1); +shop.takeOrder("with milk", 2); +shop.takeOrder("with boba", 5); + +// We create a new batch of tea for each preference. +std::cout << shop.getPreferenceCount() << std::endl; // Output: 3 + +// Take an order with a previously requested preference. +shop.takeOrder("half sugar", 4); + +// Since we have some tea from the last time this request was made, no new +// batch was created. +std::cout << shop.getPreferenceCount() << std::endl; // Output: 3 + +// Serve the customers. +shop.serve(); +``` #### When To Use