Support

Forums

Contact Me

Flyweight

Use sharing to support large numbers of fine-grained objects efficiently.




Source Code

/**
 * Declares an interface through which flyweights can receive and act on
 * extrinsic state.
 * 
 * @role __Flyweight
 */
public interface Flyweight {
	void sampleOperation(FlyweightContext context);
}

/**
 * Represents extrinsic state of flyweight(s).
 * 
 * @role __State
 */

public interface FlyweightContext {
}

/**
 * Implements the Flyweight interface and adds storage for intrinsic state, if
 * any. Objects of this class must be sharable. Any state it stores must be
 * intrinsic (independent of this object's context)
 */

public class ConcreteFlyweight implements Flyweight {
	public ConcreteFlyweight(Object key) {
		// initialize internal state
	}

	/** @see patterns.gof.flyweight.Flyweight#sampleOperation(FlyweightContext) */
	public void sampleOperation(FlyweightContext context) {
		// provide implementation here
	}
}

/**
 * Creates and manages flyweight objects. Ensures that flyweights are shared
 * properly. When a client requests a flyweight, this factory supplies an
 * existing instance or creates one, if none exists.
 * 
 * @role __Factory
 */

public class FlyweightFactory {
	private HashMap flyweight;

	public FlyweightFactory() {
		flyweight = new HashMap();
	}

	public Flyweight getFlyweight(Object key) {
		if (flyweight.containsKey(key)) {
			return (Flyweight) flyweight.get(key);
		} else {
			Flyweight newFlyweight = new ConcreteFlyweight(key);
			flyweight.put(key, newFlyweight);
			return newFlyweight;
		}
	}

	/**
	 * @return new instance ofunshared flyweight
	 */
	public Flyweight getUnsharedConcreteFlyweight() {
		return new UnsharedConcreteFlyweight();
	}
}

/**
 * Not all Flyweight subclasses need to be shared
 */

public class UnsharedConcreteFlyweight implements Flyweight {
	/** @see patterns.gof.flyweight.Flyweight#sampleOperation(FlyweightContext) */
	public void sampleOperation(FlyweightContext context) {
		// provide implementation here
	}

}
You might also like:
Proxy
3043 days ago
Proxy
Provide a surrogate or placeholder for another object to control access to it. Options are provided
Adapter
3043 days ago
Adapter
Convert the interface of a class into another interface clients expect. Adapter lets classes work to
Decorator
3043 days ago
Decorator
Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternati
Bridge
3043 days ago
Bridge
Decouple an abstraction from its implementation so that the two can vary independently.from the gang
blog comments powered by Disqus

Donations

Thank You for supporting my work