public class MazeAbstractFactory
{
public static Maze createMaze(MazeFactory pFactory)
{
Room room = pFactory.makeRoom();
Wall wall = pFactory.makeWall();
Door door = pFactory.makeDoor();
Maze maze = new Maze();
maze.addRoom(room);
maze.addWall(wall);
maze.addDoor(door);
return maze;
}
}
public class MazeFactory
{
// Factory Methods
public Room makeRoom()
{
Room room = new Room();
return room;
}
public Wall makeWall()
{
Wall wall = new Wall();
return wall;
}
public Door makeDoor()
{
Door door = new Door();
return door;
}
}
public class EvilMazeFactory extends MazeFactory
{
public Room makeRoom()
{
EvilRoom room = new EvilRoom();
return room;
}
public Wall makeWall()
{
EvilWall wall = new EvilWall();
return wall;
}
public Door makeDoor()
{
EvilDoor door = new EvilDoor();
return door;
}
}
public class GoodMazeFactory extends MazeFactory
{
public Room makeRoom()
{
GoodRoom room = new GoodRoom();
return room;
}
public Wall makeWall()
{
GoodWall wall = new GoodWall();
return wall;
}
public Door makeDoor()
{
GoodDoor door = new GoodDoor();
return door;
}
}
public class HauntedMazeFactory extends MazeFactory
{
public Room makeRoom()
{
HauntedRoom room = new HauntedRoom();
return room;
}
public Wall makeWall()
{
HauntedWall wall = new HauntedWall();
return wall;
}
public Door makeDoor()
{
HauntedDoor door = new HauntedDoor();
return door;
}
}
public class Maze
{
Collection mazeBuilder = new ArrayList();
public Maze()
{
}
public addWall(Wall pWall)
{
}
public addRoom(Room pRoom)
{
}
public addDoor(Door pDoor)
{
mazeBuilder.add(pDoor);
}
}
public class Wall
{
public Wall()
{
}
}
public class EvilWall extends Wall
{
public EvilWall()
{
}
}
public class Room
{
public Room()
{
}
}
public class EvilRoom extends Room
{
public EvilRoom()
{
}
}
public class Door
{
public Door()
{
}
}
public class EvilDoor extends Door
{
public EvilDoor()
{
}
}
/**
* Transaction would come from a webpage, and the webpage would
* prepend the type of transaction so we could create the appropriate
* object.
*/
public class MerchantBean
{
public static void main(String[] args)
{
if (args.length == 0)
{
System.out.println("Enter payment type.");
System.exit(0);
}
String name = args[0];
MazeFactory factory = new MazeFactory();
if ("Good".equals(name)) {
factory = new GoodMazeFactory();
}
else if ("Evil".equals(name)) {
factory = new EvilMazeFactory();
}
else if ("Haunted".equals(name)) {
factory = new HauntedMazeFactory();
}
Maze maze = MazeAbstractFactory.createMaze(factory);
}
}