設計模式之C#實現(一)--AbstractFactory(補) (轉)

amyz發表於2007-11-16
設計模式之C#實現(一)--AbstractFactory(補) (轉)[@more@]

此文章是為了補充下面的文章所寫,詳細資訊可以去下面看

/Develop/read_article.?id=20943">

 

GOF書中的例子用實現的原始碼:

 

using System;:namespace prefix = o ns = "urn:schemas--com::office" />

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.SetS(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( 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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982708/,如需轉載,請註明出處,否則將追究法律責任。

相關文章