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