interface Printer {
void print(Message message);
}
class Message {
private String message;
public Message(String message) {
this.message = message;
}
public void print(Printer printer) {
printer.print(this);
}
public String toString() {
return message;
}
}
abstract class AbstractPrinterFactory {
public static AbstractPrinterFactory getFactory() {
return new SystemOutPrinterFactory();
}
public abstract Printer getPrinter();
}
class SystemOutPrinterFactory extends AbstractPrinterFactory {
public Printer getPrinter() {
return new SystemOutPrinter();
}
}
class SystemOutPrinter implements Printer {
public void print(Message message) {
System.out.println(message);
}
}
public class HelloWorld {
public static void main(String[] args) {
Message message = new Message("Hello, World!");
AbstractPrinterFactory factory = AbstractPrinterFactory.getFactory();
Printer printer = factory.getPrinter();
message.print(printer);
}
}