Singleton

Introdução

public class Config {
  public static final String DEFAULT_READ_COMMUNITY_NAME = "public";
public static final String DEFAULT_CONCENTRATOR_RETRIES = "3";
public static final String DEFAULT_CONCENTRATOR_TIMEOUT = "3000";
public static final String DEFAULT_URL_CONSUMER_DATABASE = "jdbc:DBF:////home/jacques/src/celb-database"; } public class Xpto { // ... façaAlgo(Config.DEFAULT_READ_COMMUNITY_NAME); // ... }
package salame.util;
import java.io.*;
import java.util.Properties;
import java.net.URL;
import salame.SalameException;

public class Config {
  private static final String configPropFile = "salame.prop";
  private static final String DEFAULT_READ_COMMUNITY_NAME = "public";
  private static final String DEFAULT_CONCENTRATOR_RETRIES = "3";
  private static final String DEFAULT_CONCENTRATOR_TIMEOUT = "3000";
  private static final String DEFAULT_URL_CONSUMER_DATABASE = "jdbc:DBF:////home/jacques/src/celb-database";

  private String readCommunityName;
  private int concentratorRetries;
  private int concentratorTimeout;
  private String urlConsumerDatabase;

  static {
    loadConfiguration();
  }

  private void loadConfiguration() {
    prop = new Properties();
    try {
      URL resource = Config.class.getResource(configPropFile);
      if(resource == null) {
        throw new SalameException("Nao pode achar recurso: " + configPropFile);
      }
      prop.load(new BufferedInputStream(resource.openStream()));
    } catch(Exception ex ) {
      System.err.println(ex.getMessage());
      System.exit(1);
    }
    // set config variables values
    readCommunityName = prop.getProperty("ReadCommunityName",
        DEFAULT_READ_COMMUNITY_NAME);
    concentratorRetries = Integer.parseInt(prop.getProperty("ConcentratorRetries",
        DEFAULT_CONCENTRATOR_RETRIES));
    concentratorTimeout = Integer.parseInt(prop.getProperty("ConcentratorTimeout",
        DEFAULT_CONCENTRATOR_TIMEOUT));
    urlConsumerDatabase = prop.getProperty("UrlConsumerDatabase", DEFAULT_URL_CONSUMER_DATABASE);
  }

  public static String getReadCommunityName() {
    return readCommunityName;
  }
  public static int getConcentratorRetries() {
    return concentratorRetries;
  }
  public static int getConcentratorTimeout() {
    return concentratorTimeout;
  }
  public static String getUrlConsumerDatabase() {
   return urlConsumerDatabase;
  }
}

public class Xpto {
    // ...
    façaAlgo(Config.getReadCommunityName());
    // ...
}

Objetivo

Motivação

Aplicabilidade

Estrutura

singleton.gif (2826 bytes)

Participantes

Colaborações

Consequências

    NomeDeClasse.xpto();  // chamada não é polimórfica
    // ... versus ...
    Config conf = Config.getInstance();
    conf.xpto();  // essa chamada é polimórfica

Considerações de implementação

Como assegurar que haja uma única instância?

public class Config implements ConfigIF {
  private static ConfigIF instânciaÚnica = null;

  private Config() {} // o compilador não vai gerar um construtor default público

  public static ConfigIF getInstance() {
    if(instânciaÚnica == null) {
      // "lazy instantiation"
      instânciaÚnica = new Config();
    }
    return instânciaÚnica;
  }
}

Exemplo de código

Para estudar em casa

programa