1. control creation and access to instance of the objebt
2. can be use to create snapshop of an object
3. can be used when we want to be able to switch families of objects rather than a single object