此文章是为了补充下面的文章所写,详细信息可以去下面看
http://www.csdn.net/Develop/read_article.asp?id=20943
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