[plt-scheme] Singleton pattern using class.ss
On Dec 12, 2007 2:33 PM, Stephen De Gabrielle <stephen at degabrielle.name> wrote:
...
> I'm trying to work out the class.ss equivalent of java class methods and
> fields like this;
>
> > public class ActivityManager extends Thread {
> > [...]
> >    private synchronized static ActivityManager getInstance() {
> >        if ( s_instance == null || !s_instance.isAlive() ) {
> >            s_instance = new ActivityManager();
> >        }
> >        return s_instance;
> >    }
A direct translation would use a semaphore to provide the locking, and
s_instance would be #f or an activity-manager.
However, this is dangerous.  There are more and different abstractions
available in Scheme than in Java.  It is better to write idiomatic
Scheme than translate Java directly.
Here's a more idiomatic but still messy translation:
(define (make-instance)
  'foo)
(define instance-channel (make-channel))
(define instance-manager
  (thread
   (lambda ()
     (let loop ([instance #f])
       (channel-get instance-channel)
       (if instance
           (begin
             (channel-put instance-channel instance)
             (loop instance))
           (begin
             (let ([instance (make-instance)])
               (channel-put instance-channel instance)
               (loop instance))))))))
(define (get-instance)
  (channel-put instance-channel 'gimme-it)
  (channel-get instance-channel))
>  [code from prefuse.org; I'm porting bits to scheme]
[Pleased to see it's named after Prefuse 73!]
> The 'Factory Pattern' is next for me. Any suggestions gratefully accepted.
Wouldn't a function suffice in this case?
N.