mirror of
https://github.com/JakubVojvoda/design-patterns-cpp.git
synced 2025-12-17 21:04:36 +03:00
add Flyweight pattern
This commit is contained in:
102
flyweight/Flyweight.cpp
Normal file
102
flyweight/Flyweight.cpp
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
* C++ Design Patterns: Flyweight
|
||||||
|
* Author: Jakub Vojvoda [github.com/JakubVojvoda]
|
||||||
|
* 2016
|
||||||
|
*
|
||||||
|
* Source code is licensed under MIT licence
|
||||||
|
* (for more details see LICENCE)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flyweight
|
||||||
|
* declares an interface through which flyweights can receive
|
||||||
|
* and act on extrinsic state
|
||||||
|
*/
|
||||||
|
class Flyweight {
|
||||||
|
public:
|
||||||
|
virtual ~Flyweight() { /* ... */ }
|
||||||
|
virtual void operation() = 0;
|
||||||
|
// ...
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* UnsharedConcreteFlyweight
|
||||||
|
* not all subclasses need to be shared
|
||||||
|
*/
|
||||||
|
class UnsharedConcreteFlyweight : public Flyweight {
|
||||||
|
public:
|
||||||
|
UnsharedConcreteFlyweight(int intrinsic_state) :
|
||||||
|
state(intrinsic_state) {}
|
||||||
|
|
||||||
|
void operation() {
|
||||||
|
std::cout << "Unshared Flyweight with state " << state << std::endl;
|
||||||
|
}
|
||||||
|
// ...
|
||||||
|
|
||||||
|
private:
|
||||||
|
int state;
|
||||||
|
// ...
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ConcreteFlyweight
|
||||||
|
* implements the Flyweight interface and adds storage
|
||||||
|
* for intrinsic state
|
||||||
|
*/
|
||||||
|
class ConcreteFlyweight : public Flyweight {
|
||||||
|
public:
|
||||||
|
ConcreteFlyweight(int all_state) :
|
||||||
|
state(all_state) {}
|
||||||
|
|
||||||
|
void operation() {
|
||||||
|
std::cout << "Concrete Flyweight with state " << state << std::endl;
|
||||||
|
}
|
||||||
|
// ...
|
||||||
|
|
||||||
|
private:
|
||||||
|
int state;
|
||||||
|
// ...
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FlyweightFactory
|
||||||
|
* creates and manages flyweight objects and ensures
|
||||||
|
* that flyweights are shared properly
|
||||||
|
*/
|
||||||
|
class FlyweightFactory {
|
||||||
|
public:
|
||||||
|
virtual ~FlyweightFactory() {
|
||||||
|
for (auto it = flies.begin(); it != flies.end(); it++) {
|
||||||
|
delete it->second;
|
||||||
|
}
|
||||||
|
flies.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
Flyweight *getFlyweight(int key) {
|
||||||
|
if (flies.find(key) != flies.end()) {
|
||||||
|
return flies[key];
|
||||||
|
}
|
||||||
|
Flyweight *fly = new ConcreteFlyweight(key);
|
||||||
|
flies.insert(std::pair<int, Flyweight *>(key, fly));
|
||||||
|
return fly;
|
||||||
|
}
|
||||||
|
// ...
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::map<int, Flyweight *> flies;
|
||||||
|
// ...
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
FlyweightFactory *factory = new FlyweightFactory;
|
||||||
|
factory->getFlyweight(1)->operation();
|
||||||
|
factory->getFlyweight(2)->operation();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -1,9 +1,12 @@
|
|||||||
## Flyweight
|
## Flyweight
|
||||||
|
|
||||||
Use sharing to support large numbers of fine-grained objects efficiently.
|
Flyweight pattern has has structural purpose, applies to objects and uses sharing to support
|
||||||
|
large numbers of fine-grained objects efficiently. The pattern can be used to reduce
|
||||||
|
memory usage when you need to create a large number of similar objects.
|
||||||
|
|
||||||
### When to use
|
### When to use
|
||||||
|
|
||||||
|
* when one instance of a class can be used to provide many "virtual instances"
|
||||||
* when all of the following are true
|
* when all of the following are true
|
||||||
* an application uses a large number of objects
|
* an application uses a large number of objects
|
||||||
* storage costs are high because of the sheer quantity of objects
|
* storage costs are high because of the sheer quantity of objects
|
||||||
|
|||||||
Reference in New Issue
Block a user