Content
- 1. Output
Abstract Factory classes are often implemented with Factory Methods, but they can also be implemented using Prototype. Abstract Factory might store a set of Prototypes from which to clone and return product objects.
- Factory Method: creation through inheritance.
- Prototype: creation through delegation.
- Virtual constructor: defer choice of object to create until run-time.
class Expression implements Cloneable{ public String str; public Expression(String str) { this.str = str; } @Override public Expression clone() { Expression clone = null; try { clone = (Expression)super.clone(); } catch (CloneNotSupportedException ex) { ex.printStackTrace(); } return clone; } @Override public String toString() { return str; } } abstract class AbstractFactory { public Expression prototype; public Expression makePhase() { return prototype.clone(); } public abstract Expression makeCompromise(); public abstract Expression makeGrade(); } class PCFactory extends AbstractFactory { public PCFactory() { prototype = new PCPhase(); } @Override public Expression makeCompromise() { return new Expression("\"do it your way, any way, or no way\""); } @Override public Expression makeGrade() { return new Expression("\"you pass, self-esteem intact\""); } } class PCPhase extends Expression { private static int next = 0; private static final String[] list = {"\"animal companion\"", "\"vertically challenged\"", "\"factually inaccurate\"", "\"chronologically gifted\""}; public PCPhase() { super(list[next]); next = (next + 1) % list.length; } @Override public Expression clone() { return new PCPhase(); } } class NotPCPhase extends Expression { private static int next = 0; private static final String[] list = {"\"pet\"", "\"short\"", "\"lie\"", "\"old\""}; public NotPCPhase() { super(list[next]); next = (next + 1) % list.length; } @Override public Expression clone() { return new NotPCPhase(); } } class NotPCFactory extends AbstractFactory { public NotPCFactory() { prototype = new NotPCPhase(); } @Override public Expression makeGrade() { return new Expression("\"my way, or the highway\""); } @Override public Expression makeCompromise() { return new Expression("\"take test, deal with the results\""); } } public class FactoryFmProto { public static void main(String[] args) { AbstractFactory factory; if (args.length > 0) { factory = new PCFactory(); } else { factory = new NotPCFactory(); } for (int i = 0; i < 3; i++) { System.out.print(factory.makePhase() + " "); } System.out.println(); System.out.println(factory.makeCompromise()); System.out.println(factory.makeGrade()); } }
Output
if args = 0 "short" "lie" "old" "my way, or the highway" "take test, deal with the results" if args > 0 "vertically challenged" "factually inaccurate" "chronologically gifted" "do it your way, any way, or no way" "you pass, self-esteem intact"