AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > .NET技术

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

51自学网 http://www.wanshiok.com
  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

 

 

 
上一篇:设计模式之C#实现(二)---Builder  下一篇:设计模式之C#实现(一)--AbstractFactory