#include <iostream>
#include <memory>
#include <unordered_map>
class Flyweight {
public:
Flyweight(int data) : data_(data) {}
void show() { std::cout << "In Flyweight show(). data_ is " << data_ << std::endl; }
private:
int data_ = 0;
};
class FlyweightFactory {
public:
std::shared_ptr<Flyweight> getFlyweight(int data) {
if (umf.find(data) != umf.end()) {
std::cout << "In FlayweightFactory getFlayweight(). We have " << data << std::endl;
} else {
std::cout << "In FlayweightFactory getFlayweight(). We create " << data << std::endl;
std::shared_ptr<Flyweight> f = std::make_shared<Flyweight>(data);
umf.insert(std::make_pair(data, f));
}
return umf.at(data);
}
private:
std::unordered_map<int, std::shared_ptr<Flyweight>> umf;
};
int main(int argc, char *argv[]) {
FlyweightFactory ff;
ff.getFlyweight(1);
ff.getFlyweight(2);
ff.getFlyweight(1);
return 1;
}