设计模式之抽象工厂(一)

一。组成部分
1.抽象工厂----担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
2.具体工厂----这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
3.抽象产品----担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
4.具体产品----抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
5.用户----用户通过抽象工厂和抽象产品选择自己所需要的具体产品
二。UML类图

三。代码
  1using System;
  2using System.Collections.Generic;
  3using System.Text;
  4
  5namespace Pattern
  6{
  7    public class AbstratcFactory
  8    {
  9        public static void Main(string[] args)
 10        {
 11            AbstractSql delete = new SqlServer();
 12            ClientUser user1 = new ClientUser(delete);
 13            user1.Show();
 14
 15            AbstractSql insert = new Oracle();
 16            ClientUser user2 = new ClientUser(insert);
 17            user2.Show();
 18        }

 19    }

 20    
 21    //抽象工厂类
 22    public abstract class AbstractSql
 23    
 24        public abstract AbstractInsert Insert();
 25        public abstract AbstractDelete Delete();
 26    }

 27
 28    //具体工厂[SqlServer]
 29    public class SqlServer:AbstractSql
 30    {
 31        public override AbstractInsert Insert()
 32        {
 33            return new SqlServerInsert();
 34        }

 35
 36        public override AbstractDelete Delete()
 37        {
 38            return new SqlServerDelete();
 39        }

 40    }

 41
 42    //具体工厂[Oracle]
 43    public class Oracle:AbstractSql
 44    {
 45        public override AbstractInsert Insert()
 46        {
 47            return new OracleInsert();
 48        }

 49
 50        public override AbstractDelete Delete()
 51        {
 52            return new OracleDelete();
 53        }

 54    }

 55
 56    //抽象产品[Insert]
 57    public abstract class AbstractInsert
 58    {   }
 59   
 60    //抽象产品[Delete]
 61    public abstract class AbstractDelete
 62    {
 63        public abstract void Interact(AbstractInsert insert);
 64    }

 65
 66    //具体产品1[SqlServerInsert]
 67    public class SqlServerInsert : AbstractInsert
 68    {  }
 69        
 70    //具体产品1[OracleInsert]
 71    public class OracleInsert : AbstractInsert
 72    { }
 73    
 74    //具体产品2[SqlServerDelete]
 75    public class SqlServerDelete : AbstractDelete
 76    {
 77        public override void Interact(AbstractInsert insert)
 78        {
 79            Console.WriteLine(this.GetType().Name + "  interacts with:  " + insert.GetType().Name);
 80        }

 81    }

 82    //具体产品2[OracleDelete]
 83    public class OracleDelete : AbstractDelete
 84    {
 85        public override void Interact(AbstractInsert insert)
 86        {
 87            Console.WriteLine(this.GetType().Name + "  interacts with:  " + insert.GetType().Name);
 88        }

 89    }

 90
 91    //用户
 92    public class ClientUser
 93    {
 94        private AbstractInsert AbstractInsert;
 95        private AbstractDelete AbstractDelete;
 96
 97        public ClientUser(AbstractSql sql)
 98        {
 99            AbstractInsert = sql.Insert();
100            AbstractDelete = sql.Delete();
101        }

102
103        public void Show()
104        {
105            AbstractDelete.Interact(AbstractInsert);
106        }

107    }

108}

109
posted @ 2008-04-30 16:35  金鱼  阅读(533)  评论(0编辑  收藏  举报