On Sun, 2003-02-02 at 06:05, Fionn Behrens wrote:
> On Fre, 2003-01-31 at 22:53, Ian Bicking wrote:
> > On Fri, 2003-01-31 at 12:31, Fionn Behrens wrote:
> > > I have one problem left, however.
> > > [...]
> > You can still put it in a global, but you need to do locking to handle
> > this. I'd personally use a combination of my own ParamFactory and
> > Persist modules, which are primitive but effective. I think it would go
> > something like:
> > class _Image(PersistMixin):
> This looks very similar to what I alredy have.
> > Image = ParamFactory(_Image)
> So this factory has to be the needed part that is only there once. Since
> I am not quite accustomed to factories (admittedly all I know about them
> is that I already read the term some time on this list) my problem has
> not yet vanished but shifteed to: where should that factory class go to
> be instantiated only once?
Essentially instead of Image being a class, it is a function that has
access to a cache of instances. So anytime you call Image with the same
tuple of parameters you'll get the cached instance if possible. (As a
result you can't use default parameters or even keywords -- a fancier
ParamFactory could probably deal with that, but this one can't.)
Anyway, just use the Image factory everywhere you were using the class,
and _Image just lives behind the scenes.
A "factory" just means something that returns objects, but in a more
flexible manner than a class. In this case it creates objects on
demand, or returns existing objects if available. The servlet factories
in Webware also do some object initialization in addition to pooling.
With Python 2.2 you can also do this same stuff with the __new__ method,
which doesn't require a separate factory (though you'd probably want a
mix-in, since the basic concept is reusable). I don't like the way
__new__ was implemented, though -- it actually requires more change to
your code than does the factory.
Ian Bicking Colorstudy Web Development
PGP: gpg --keyserver pgp.mit.edu --recv-keys 0x9B9E28B7
4869 N Talman Ave, Chicago, IL 60625 / (773) 275-7241