Imagine a online finance dashboard where a Finance consultant and his Client discuss, do some calculation , presentation, template and query filling like activities, and finally ends session of discussion. Such dashboard can have various tools and repetitive actions and forms which can be used through discussion. Lets take a case of 1000 customers at any time on dashboard, 100 tasks and forms , again 40 conditions for each task and form. So at least
1000*100*40= 4000000 Objects ( or near to it if consider some static design ) and corresponding GC() cycle we have to support to meet our requirement.
By using proper design and data structure we can reduce this problem and can speed up Dashboard loading and tool performance etc… use of Flyweight pattern and IdentityHashMap is perfect combination for use-case like above.
The Flyweight pattern is suitable for a context free and frequently used large object creations.
IdentityHashMap – This class implements the Map interface with a hash table, in an IdentityHashMap, two keys k1 and k2 are considered equal if and only if (k1==k2). (In normal Map implementations (like HashMap) two keys k1 and k2 are considered equal if and only if (k1==null ? k2==null : k1.equals(k2)).)
Here is one sample code that you can refactor for your own similar use-case.
import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Map.Entry; public class HashedIdentityDashBoard { public static void main(String[] args) { HashMap<String, DashBoard> hm = new HashMap<String, DashBoard>(); IdentityHashMap<DashBoard, String> idenHM = new IdentityHashMap<DashBoard, String>(); hm.put("PendingTasks", new PendingTasks()); hm.put("DailyTasks", new DailyTasks()); hm.put("EscalatedTasks", new EscalatedTasks()); // and 100 more repetitive tasks // identity map for repetitive tasks and their Templates and Query Forms idenHM.put(hm.get("PendingTasks"), "40 Templates and Query form of PendingTasks"); idenHM.put(hm.get("DailyTasks"), "40 Templates and Query form of DailyTasks"); idenHM.put(hm.get("EscalatedTasks"), "40 Templates and Query form of EscalatedTasks"); // only for 1000 users we need 1000*100*40 = 4000000 Objects for (Entry<DashBoard, String> entry : idenHM.entrySet()) { DashBoard dashBoard = entry.getKey(); System.out.println("Key : " + dashBoard + " : Value : " + idenHM.get(dashBoard)); } } } interface DashBoard { public void setTitle(String widgetTitle); } abstract class AbstractUserDashBoard implements DashBoard { public String dashBoardName; abstract public void setTitle(String widgetTitle); @Override public String toString() { return "Title of DashBoard is :" + this.dashBoardName + " and hashCode is " + this.hashCode(); } } class DailyTasks extends AbstractUserDashBoard { public DailyTasks() { setTitle("DailyTasks"); System.out.println(this); } @Override public void setTitle(String widgetTitle) { this.dashBoardName = widgetTitle; } } class PendingTasks extends AbstractUserDashBoard { public PendingTasks() { setTitle("PendingTasks"); System.out.println(this); } @Override public void setTitle(String widgetTitle) { this.dashBoardName = widgetTitle; } } class EscalatedTasks extends AbstractUserDashBoard { public EscalatedTasks() { setTitle("EscalatedTasks"); System.out.println(this); } @Override public void setTitle(String widgetTitle) { this.dashBoardName = widgetTitle; } }
A post like this would be a perfect opportunity to explain the Flyweight Pattern, its benefits, and its pitfalls.
LikeLiked by 1 person
Thanks gregsdennis. comment if you would like to add any change / improvement.
LikeLike
Hi my name is Livia Schacter and I just wanted to drop you a quick note here instead of calling you. I came to your Effective use of IdentityHashMap and Flyweight Pattern | { java : job : mac } website and noticed you could have a lot more hits. I have found that the key to running a successful website is making sure the visitors you are getting are interested in your website topic. There is a company that you can get keyword targeted visitors from and they let you try the service for free for 7 days. I managed to get over 300 targeted visitors to day to my site. http://iscripts.co/r
LikeLike