The proxy pattern can be used in situations where multiple copies of a complex object must exist. In order to reduce the application's memory footprint in these situations, you create one instance of the complex object along with multiple proxy objects, all of which contain a reference to the single original complex object. Any operations performed on the proxy objects are forwarded to the original object. Once all instances of the proxy are out of scope, the complex object's memory may be deallocated.
Here's a list of the various types of proxy patterns:
- Remote Proxy: Provides a reference to an object located in a different address space on the same or different machine.
- Virtual Proxy: Allows the creation of a memory intensive object on demand. The object will not be created until it is really needed.
- Copy-on-write Proxy: Defers copying (cloning) a target object until required by client actions. Really a form of virtual proxy.
- Protection (Access) Proxy: Provides different clients with different levels of access to a target object.
- Cache Proxy: Provides temporary storage of the results of expensive target operations so that multiple clients can share the results.
- Firewall Proxy: Protects targets from bad clients (or vice versa).
- Synchronization Proxy: Provides multiple accesses to a target object.
- Smart Reference Proxy: Provides additional actions whenever a target object is referenced, such as counting the number of references to the object.