package net.zuckerfrei.jcfd;
/**
* Factory for creating <code>Definition</code> objects. It has pluggable
* implementation and is implemented as a singleton.
*
* @author Davor Cengija
* @version $Revision: 1.1.1.1 $
*
* @see net.zuckerfrei.jcfd.simple.SimpleDefinitionFactory
* @see net.zuckerfrei.jcfd.Definition
* @see net.zuckerfrei.jcfd.simple.SimpleDefinition
* @see net.zuckerfrei.jcfd.Configuration#getDefinitionFactoryClassName()
*/
public abstract class DefinitionFactory {
//~ Static variables/initializers =========================================
/**
* Factory object, singleton.
*/
private static DefinitionFactory factory = null;
/**
* Lock object.
*/
private static Object lock = new Object();
/**
* Class name of the implementation.
*/
private static String defintionFactoryClassName = Configuration.getInstance().getDefinitionFactoryClassName();
//~ Methods ===============================================================
/**
* Static method for reaching the factory implementation.
*
* @return factory implementation.
*/
public static DefinitionFactory getInstance() {
if (factory == null) {
synchronized (lock) {
if (factory == null) {
try {
Class c = Class.forName(defintionFactoryClassName);
factory = (DefinitionFactory) c.newInstance();
}
catch (ClassNotFoundException e) {
throw new IllegalArgumentException(e.getMessage());
}
catch (InstantiationException e) {
throw new IllegalArgumentException(e.getMessage());
}
catch (IllegalAccessException e) {
throw new IllegalArgumentException(e.getMessage());
}
}
}
}
return factory;
}
/**
* Creates <code>Definition</code> object. Objects created in this way must be ready for use.
*
* @param word for which this definition is.
* @param database from which this definition is.
* @param content The very definition fetched from the server.
*
* @return Definition ready for use.
*/
public abstract Definition createDefinition(String word, Database database, Object content);
}