Solution: The Abstract Factory pattern defines the interface for how to create each member of the family.
public interface WindowFactory { Window createWindow(); // implicitly public }
public MsWindowFactory implements WindowFactory { @Override public Window createWindow() { return new MsWindow(); } }
public AppleWindowFactory implements WindowFactory { @Override public Window createWindow() { return new AppleWindow(); } }
public Client { public static void main(String[] args) { WindowFactory factory; String osName = System.getProperty("os.name"); if ((osName != null) && (osName.indexOf("Windows") != -1)) { factory = new MsWindowFactory(); } else { factory = new AppleWindowFactory(); } Window window = factory.createWindow(); } }