设计模式之C#实现(一)--AbstractFactory(补)

发表于:2007-06-21来源:作者:点击数: 标签:
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 cla

     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

原文转自:http://www.ltesting.net