Monday, January 23, 2012

The Factory Method pattern

Problem: A class needs to instantiate a derivation of another class, but doesn't know which one.
Solution: The Factory Method defines an interface for creating objects, but lets subclasses decide which classes to instantiate.
public interface Logger {
    void debug(String message); // implicitly public
}
public class FileLogger implements Logger {
    @Override public void debug(String message) { ... }
}
public abstract class AbstractLoggerFactory {
    public abstract Logger createLogger(); // factory method

    public Logger getLogger() {
        Logger logger = createLogger();
        ...
        return logger;
    }
}
public class FileLoggerFactory extends AbstractLoggerFactory {
    @Override
    public Logger createLogger() {
        return new FileLogger();
    }
}
public class Client {
    private AbstractLoggerFactory factory = new FileLoggerFactory();
    public doSomething(AbstractLoggerFactory factory) {
        Logger logger = factory.getLogger();
        logger.debug("debug message");
    }
}