my question here is not strictly language related, it is more a general programming concept.
If I have a Factory class that has a method to return Parser objects, and these parser classes ,I know, do not need to be instantiated more than once per iteration cycle (outside of the factory, of course).
It is better, in terms of use and object separation to create a caching mechanisms for all the instantiated Parsers inside of the Factory, ie: during the method call, or outside of it, when the method has already been called?
Thanks in advance.
Perhaps you could define an interface for your Factory
, and then have multiple implementations - one implementation could perform the caching internally to guarantee that a Parser
class is only instantiated once. Another implementation could perform no caching and just provide new Parser
objects whenever something asks for one.
Either way, I suggest you try to keep this logic inside your Factory
implementations and have the rest of your application work with the Factory
interface. This way if you decide later that you don't want to cache anything or that you need to change the way a Parser
is instantiated, you only have a single point of object creation - inside the Factory
. This makes it really easy to change the way you construct Parser
objects without having to change every part of your application that wants a new Parser
.
Once again - if you create caching mechanisms to operate outside of the Factory
, then those mechanisms will be all over your code since you have to use them whenever you want to get a new Parser
. If you decide later to change the caching mechanism, you're going to have to touch a lot of code, but if you do the caching inside the Factory
, you only have to change the Factory
implementation.
I don't understand the problem: the clients of the factory class don't care whether the objects they receive are cached or not. So the caching logic must belong to the factory.
Moreover, when you implement this, you first implement the factory without caching in order to have something working fast (Do the simplest thing that could possibly work). Then, you implement caching. Note that doing anything else is a case of premature optimization. If the client classes had to know whether the objects are cached or not, your development process would rot quickly.
How you implement it is up to you. I like writing once a generic caching class and reuse it in situations like this, but you could think about other mechanisms. Besides, I don't do java and therefore I cannot state about what is better to do here.
(PS: I see a lot of design pattern noise in the answers to this question. Is this common among java people to always think in term of patterns ? There are no singletons to design, no proxy classes to write here, only a simple reasoning about which interface cannot change).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With