我可以在Scheme中实现这样的单例设计模式吗?



我对设计模式知之甚少,今天我学习了Singleton设计模式,所以我尝试了一下在Scheme中实现如下

(define nil '())
(define Singleton
  (let ((instance nil))
    (lambda ()
      (if (null? instance)
          (let ((a 0))
            (define (dispatch msg)
              (cond ((eq? msg 'get)
                     (lambda () a))
                    ((eq? msg 'set)
                     (lambda (v) 
                       (begin (set! a v)
                              'ok)))))
              (set! instance dispatch)))
      instance)))
(define a (Singleton))
(define b (Singleton))
(eq? a b);;#t
((a 'set) 3)
((b 'get));;3
我对这个设计模式的理解和实现对吗?

您的实现是正确的,因为(eq? a b)#t

我会把它简化一点(尽管这不是Code Review),像这样:

    如果是第一次调用,
  1. 不需要标记;只需定义调度程序一次,并不断返回对它的引用
  2. 不需要定义nil, '()就可以了
  3. 我个人更喜欢使用(a 'set 3)而不是((a 'set) 3)
  4. 在这种情况下,使用case而不是cond更清楚

(define Singleton
  (let ((a 0))                     ; instance variables
    (define (get) a)
    (define (set v) (set! a v) 'ok)
    (define (dispatch msg . args)  ; dispatcher procedure
      (case msg
        ((get) (apply get args))
        ((set) (apply set args))
        (else  (error "unknown message"))))
    (lambda () dispatch)))         ; return dispatch procedure
然后

(define a (Singleton))
(define b (Singleton))
(eq? a b)    ;;  #t
(a 'set 3)   ;; 'ok
(b 'get)     ;;   3

最新更新