Without violating encapsulation, capture and externalize an object's internal state
so that the object can be restored to this state later.
- Need to save a "snapshot"
- Need to save state without exposing the implementation of an object
- Preserves encapsulation boundaries
- Simplifies Originator
- Can have high storage costs