GOF书中的例子用C#实现的源码: using System; namespace AbstractFactory_Maze{ using Maze; public interface AbstractFactory{ MazeClass MakeMaze(); Wall MakeWall(); Room MakeRoom(int n); Door MakeDoor(Room oneRoom,Room otherRoom); } public class MazeFactory : AbstractFactory{ public MazeClass MakeMaze(){ return new MazeClass(); } public Wall MakeWall(){ return new Wall(); } public Room MakeRoom(int n){ return new Room(n); } public Door MakeDoor(Room oneRoom,Room otherRoom){ return new Door(oneRoom,otherRoom); } } // this is a client public class MazeGame{ public MazeClass MazeCreate(AbstractFactory factory){ MazeClass aMaze = factory.MakeMaze(); Room r1 = factory.MakeRoom(1); Room r2 = factory.MakeRoom(2); Door aDoor = factory.MakeDoor(r1,r2); aMaze.AddRoom(r1); aMaze.AddRoom(r2); r1.SetSide(Direction.North,factory.MakeWall()); r1.SetSide(Direction.East,aDoor); r1.SetSide(Direction.South,factory.MakeWall()); r1.SetSide(Direction.West,factory.MakeWall()); r2.SetSide(Direction.North,factory.MakeWall()); r2.SetSide(Direction.East,factory.MakeWall()); r2.SetSide(Direction.South,factory.MakeWall()); r2.SetSide(Direction.West,aDoor); return aMaze; } } } namespace Maze{ using System.Collections; public class MapSite{ public virtual void Enter(){} } public enum Direction {North,South,East,West} public class Room : MapSite{ public string Print(){ string result = ""; for(int i = 0 ;i<=3;i++){ switch(i){ case (int)Direction.East:{ result += "East is:"+this.GetSide(Direction.East)+"/t"; break; } case (int)Direction.North:{ result += "North is:"+this.GetSide(Direction.North)+"/t"; break; } case (int)Direction.South:{ result += "South is:"+this.GetSide(Direction.South)+"/t"; break; } case (int)Direction.West:{ result += "West is:"+this.GetSide(Direction.West)+"/t"; break; } } } return result; } public Room(int n){ this.m_roomNumber = n; } public MapSite GetSide(Direction dir){ return this.m_sides[(int)dir]; } public void SetSide(Direction dir,MapSite mapSite){ this.m_sides[(int)dir] = mapSite; } public override void Enter(){} private MapSite[] m_sides = new MapSite[4]; int m_roomNumber; } public class Wall : MapSite{ public Wall(){} public override void Enter(){} } public class Door : MapSite{ public Door(Room oneRoom,Room otherRoom){} public override void Enter(){} public Room oneRoom{ get{return this.m_oneRoom;} set{this.m_oneRoom = value;} } private Room m_oneRoom; public Room otherRoom{ get{return this.m_otherRoom;} set{this.m_otherRoom = value;} } private Room m_otherRoom; private bool m_isOpen; public bool IsOpen{ get{return this.m_isOpen;} set{this.m_isOpen = value;} } } public class MazeClass{ public MazeClass(){} public string Print(){ string result = ""; for(int i = 0; i<=this.m_Maze.Count-1;i++){ result +=this.RoomNumber(i).Print()+"/n"; } return result; } public void AddRoom(Room room){ m_Maze.Add(room); } public Room RoomNumber(int roomNumber){ return (Room)this.m_Maze[roomNumber]; } private ArrayList m_Maze = new ArrayList(); } } private void Form1_Load(object sender, System.EventArgs e) { AbstractFactory factory = new MazeFactory(); MazeGame game = new MazeGame(); MazeClass aMaze = game.MazeCreate(factory); this.richTextBox1.AppendText(aMaze.Print()); } 以下为输出结果: North is:Maze.Wall South is:Maze.Wall East is:Maze.Door West is:Maze.Wall North is:Maze.Wall South is:Maze.Wall East is:Maze.Wall West is:Maze.Door  
|