| /*
 The Design Patterns Java Companion
 
 Copyright (C) 1998, by James W. Cooper
 
 IBM Thomas J. Watson Research Center
 
 */
 class Spooler {
 //this is a prototype for a printer-spooler class
 //such that only one instance can ever exist
 static boolean instance_flag = false; //true if 1 instance
 
 public Spooler() throws SingletonException {
 if (instance_flag)
 throw new SingletonException("Only one printer allowed");
 else
 instance_flag = true; //set flag for 1 instance
 System.out.println("printer opened");
 }
 
 public void finalize() {
 instance_flag = false;
 }
 }
 
 class SingletonException extends RuntimeException {
 //new exception type for singleton classes
 public SingletonException() {
 super();
 }
 
 public SingletonException(String s) {
 super(s);
 }
 }
 
 public class SingleSpooler {
 static public void main(String argv[]) {
 Spooler pr1, pr2;
 //open one printer--this should always work
 System.out.println("Opening one spooler");
 try {
 pr1 = new Spooler();
 } catch (SingletonException e) {
 System.out.println(e.getMessage());
 }
 //try to open another printer --should fail
 System.out.println("Opening two spoolers");
 try {
 pr2 = new Spooler();
 } catch (SingletonException e) {
 System.out.println(e.getMessage());
 }
 }
 }
 
 
 
 |