Design Patterns - Factory Method

The factory method pattern defines an interface for creating an object but lets subclasses decide which class to instantiate.

Just like with the simple factory design pattern, you can just think of it as a smart constructor.

The interfaces

public interface ServerFactory {
	Server createServer();
}
public interface Server {
	String getType();
}

Concrete implementations

Unlike with the simple factory, the concrete implementations is of both the factories and the classes to create.

Concrete classes to instantiate

public class DatabaseServer implements Server {

	@Override
	public String getType() {
		return "DatabaseServer";
	}

}
public class WebServer implements Server {

	@Override
	public String getType() {
		return "WebServer";
	}

}

Concrete factories

public class DatabaseServerFactory implements ServerFactory {

	@Override
	public Server createServer() {
		return new DatabaseServer();
	}

}
public class WebServerFactory implements ServerFactory {

	@Override
	public Server createServer() {
		return new WebServer();
	}

}

Usage from the client’s perspective

ServerFactory factory = new WebServerFactory();
Server server = factory.createServer();
System.out.println(server.getType()); // WebServer