Solution: The Factory Method defines an interface for creating objects, but lets subclasses decide which classes to instantiate.
1 2 3 | public interface Logger { void debug(String message); // implicitly public } |
1 2 3 | public class FileLogger implements Logger { @Override public void debug(String message) { ... } } |
1 2 3 4 5 6 7 8 9 | public abstract class AbstractLoggerFactory { public abstract Logger createLogger(); // factory method public Logger getLogger() { Logger logger = createLogger(); ... return logger; } } |
1 2 3 4 5 6 | public class FileLoggerFactory extends AbstractLoggerFactory { @Override public Logger createLogger() { return new FileLogger(); } } |
1 2 3 4 5 6 7 | public class Client { private AbstractLoggerFactory factory = new FileLoggerFactory(); public doSomething(AbstractLoggerFactory factory) { Logger logger = factory.getLogger(); logger.debug( "debug message" ); } } |