Win a copy of Think Java: How to Think Like a Computer Scientist this week in the Java in General forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

Template Method/Singleton with Factory

 
Mark Spritzler
ranger
Sheriff
Posts: 17278
6
IntelliJ IDE Mac Spring
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I am putting together an abstract Singelton, that will then have implementing classes. These classes should only need to override one method(Hence the Template Method) so that it all works for the specific implementation type.

So I have this abstract class



And here is an implementation class



Forget about the implementation of the loadData method, it is using Hibernate to do a search for me.

But notice the static initializer.

OK, so you might guess what I am trying to do, but I am having no luck. I am just missing something that probably is pretty easy.

I am trying to make a call to getInstance of the object, and it will return the Singleton instance. Now the class that is calling getInstance is doing so through Reflection because that class only knows its type as the abstract class type.

Here is my CacheFactory that will either return an instance of that type that exists in a Map it has, or will create a new one and add it to the Map.



The problem right now is that the loadLookup method calling the getInstance static method is returning null.

I obviously want to make sure that when you call getInstance on any type of AbstractLookup and there is no instance of that type yet, that it will create one, and call loadData().

What I am oblivious to?

Thanks

Mark
 
Karthik Guru
Ranch Hand
Posts: 1209
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I dont know if its a typo on your part but I dont see a 'static' block though in DiscountTypeLookup

 
Ken Blair
Ranch Hand
Posts: 1078
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Even with it changed to a static block it won't work. The problem here is the DefaultLookup class is never loaded, the only method called belongs to AbstractLookup. Even it were loaded there's still a fatal flaw in the design: each new class loaded uses the same static variable.

I believe you'll need to create a registry or make getInstance() abstract and move the static variable to the implementing class.



Or a registry.

 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic