home *** CD-ROM | disk | FTP | other *** search
- ; From: Dat Thuc Nguyen
- ; Date: Wed, 23 Jun 1999 20:38:06 +0000
- ; Subject: Incoming Script - singleton.ksc
- ; URL: http://www.smalltickle.com
- ;
- ; IN THE PATTERNS COMMUNITY, THE SINGLETON IS A CLASS THAT CAN
- ; HAVE ONLY ONE INSTANCE. ALL OBJECTS INSTANTIATED FROM THAT
- ; CLASS REFER TO THE ONE AND ONLY SINGLETON!
- ;
- ; THE SINGLETON IS VERY USEFUL WHERE THERE IS ONLY ONE RESOURCE
- ; AVAILABLE AND VARIOUS USER-DEFINED FUNCTIONS ACCESS THAT
- ; RESOURCE UNDER DIFFERENT REFFERENCES.
- ;
- ; THE SINGLETON CLASS ENSURES THAT ONE AND ONLY ONE OBJECT CAN BE
- ; INSTANTIATED FROM IT, THOUGH UNDER DIFFERENT NAMES.
- ; THE FOLLOWING SCRIPT DEFINES A SINGLETON CLASS.
-
- ;********************************************************
- ; DEFINITION OF THE SINGLETON CLASS *
- ;********************************************************
- define singleton {
- if NOT define \m(singleton::singleton) {
- assign singleton::singleton 0
- }
-
- _define \%1 {
- singleton::\%1 \v(macro)
- }
- }
-
- ;******************************************************
- ; IMPLEMENTATION OF THE PUBLIC USAGE INTERFACE *
- ; OF THE SEMAPHORE CLASS *
- ;******************************************************
-
- ; Smalltalk syntax
- define singleton::up {
- assign singleton::singleton \feval(\m(singleton::singleton) + 1)
- echo \m(singleton::singleton)
- }
-
- define singleton::down {
- assign singleton::singleton \feval(\m(singleton::singleton) - 1)
- echo \m(singleton::singleton)
- }
-
- define singleton::query {
- echo \m(singleton::singleton)
- return \m(singleton::singleton)
- }
-
- ; C++ syntax
- define singleton::++ {
- assign singleton::singleton \feval(\m(singleton::singleton) + 1)
- echo \m(singleton::singleton)
- }
-
- define singleton::-- {
- assign singleton::singleton \feval(\m(singleton::singleton) - 1)
- echo \m(singleton::singleton)
- }
-
- ;********************************************************
- ; USAGE SAMPLES *
- ;********************************************************
-
- take singleton.ksc
-
- ; In a user-defined function:
- singleton printer ; create a singleton for printer
- ; there is only one printer !!!
-
- if = \fexec(printer query) 0 { ; if printer is available
- printer up ; register for printer
- do_some_processing ;
- printer down ; release printer
- }
- ;
- ;
- ; In another user-defined function
- singleton my_printer ; refer always to the same singleton
- ; as the printer above
- if = \fexec(my_printer query) 0 { ; if printer is available
- my_printer up : Register for printer
- do_some_processing ;
- my_printer down ; release printer
- }
-
- ; EXPERIMENT
- ;
- for \%i 1 10 1 { printer up }
- printer query ; 'printer query' and 'my_printer query'
- my_printer query ; produce the same result, that's singleton
-