This week's book giveaway is in the OO, Patterns, UML and Refactoring forum. We're giving away four copies of Refactoring for Software Design Smells: Managing Technical Debt and have Girish Suryanarayana, Ganesh Samarthyam & Tushar Sharma on-line! See this thread for details.
What exactly you mean by UnsharedConcreteFlyweight?
Joined: May 23, 2005
In GOF book below is explained but not it is not at all clear to me what exactly it does and in what scenario it should be used
Not all Flyweight subclasses need to be shared. The Flyweight interface enables sharing; it doesn't enforce it. It's common for UnsharedConcreteFlyweight objects to have ConcreteFlyweight objects as children at some level in the flyweight object structure (as the Row and Column classes have).
After your post I did some Googling on flyWeight pattern and following are some main points that I think we must keep in mind while using Flyweight pattern in our application:
1) Flyweight is used when we want to avoid creating multiple objects of the same kind and share existing instances. These objects are shared based on the intrinsic state + extrinsic state. I believe this part is clear to you.
2) We can have a set of flyweights which we don't want to share. Now lets discuss this part. We need to remember the following points for the unshared flyweights:
a) This is an optional part of the flyweight. We need not have in all the flyweight pattern implementations.
b) Understand when we use it. For example:- if we want to design an application where we have shopping cart collection object containing different products we can use Flyweight pattern. Now for each product we have an intrinsic state like the name, description, feature set etc. and extrinsic state like the number of this product present in shopping cart. Here we can easily use shared flyweight for all the different product objects. But we can have some products like assembled computer which cannot be same for all customers who plans to buy it. For this type of products we might wish to create a new object whenever any customer adds it in their basket.