Singleton Pattern
Vejledende løsninger
1 Først laver vi Singleton klassen:
DebugFrame.java
import javax.swing.*;

public class DebugFrame extends JFrame {
  /*
   * Klasse-variable og -metoder
   */
  private static DebugFrame inst=null;
  
  public static DebugFrame instance() {
    if ( inst == null )
      inst = new DebugFrame( "Debug window" );
    
    return inst;
  }
  
  /*
   * Instance-variable og -metoder
   */
  private JTextArea area;
  
  private DebugFrame( String title ) {
    super( title );
    
    area = new JTextArea( 12, 40 );
    getContentPane().add( new JScrollPane( area ) );
    
    pack();
    setVisible( true );
  }
  
  public void message( String msg ) {
    area.append( msg + "\n" );
  }
}
Vi undlader at sætte default closing operation, da man formodentlig ikke ønsker at debug-framen skal optræde som applikations-vindue.

Dernæst har vi test-anvendelsen.

Main.java
public class Main {
  
  public static void main( String[] args ) {

    for ( int i=0; i<100; i++ )
      DebugFrame.instance().message( "Testbesked " + i );
  }
}
Figur 1:
100 debug-beskeder
2 Selve Singleton klassen får følgende udseende
LogFile.java
import java.io.*;
import java.util.*;

public class LogFile {
  /*
   * Klasse-variable og -metoder
   */
  private static LogFile inst;
  private static boolean access=true;
  
  public static LogFile instance() {
    if ( !access )
      return null;
    
    if ( inst == null )
      inst = new LogFile();
    
    return inst;
  }

  /*
   * Instans-variable og -metoder
   */
  private BufferedWriter output;
  private String filename;

  private LogFile() {
    filename = "log.txt";
    
    try {
      output = new BufferedWriter( new FileWriter( filename ) );
      
    } catch ( IOException e ) {
      System.err.println( "Could not open: " + filename );
      access=false;;
    }
  }
  
  public boolean register( String s ) {
    if ( !access )
      return false;
    
    s = "[" + new Date() + "] " + s;
    
    try {
      output.write( s );
      output.newLine();
    
      return true;
      
    } catch ( IOException e ) {
      System.err.println( "Could not write to: " + filename );
      access = false;
      return false;
    }
  }
  
  public boolean close() {
    try {
      output.close();
      access = false;
      
      return true;
      
    } catch ( IOException e ) {
      System.err.println( "Could not close: " + filename );
      return false;
    }
  }
}
Vi har her valgt at implementere tilgængeligheds-egenskaben med en boolsk variabel. Den sættes som udgangspunkt til true, men hvis en klient kalder close sættes den til false og al efterfølgende adgang til at arbejde med filen vil blive afvist. Bemærk at variabelen nødvendigvis må være en klasse-variabel, da instance-metoden ellers ikke vil kunne afvise forsøg på at få en reference til instansen efter den er "lukket".
Main.java
public class Main {
  
  public static void main( String[] args ) {

    for ( int i=0; i<10; i++ )
      LogFile.instance().register( "Event " + i );

    LogFile.instance().close();
  }
}
Hvilket giver følgende resultat:
log.txt
[Sat Feb 05 18:24:49 CET 2000] Event 0
[Sat Feb 05 18:24:50 CET 2000] Event 1
[Sat Feb 05 18:24:50 CET 2000] Event 2
[Sat Feb 05 18:24:50 CET 2000] Event 3
[Sat Feb 05 18:24:50 CET 2000] Event 4
[Sat Feb 05 18:24:50 CET 2000] Event 5
[Sat Feb 05 18:24:50 CET 2000] Event 6
[Sat Feb 05 18:24:50 CET 2000] Event 7
[Sat Feb 05 18:24:50 CET 2000] Event 8
[Sat Feb 05 18:24:50 CET 2000] Event 9