设计模式(三)(Abstract Factory)抽象工厂

  • 定义:

抽象工厂同工厂方法有相似处:都提供了对子类创建的封装,都是有工厂方法的接口实现类的中决定了子类被创建为什么对象。

不同于工厂方法之处:工厂方法创建的对象只是一个类型的子类,而抽象工厂创建的对象为多个类型的不同类。

例如:工厂方法创建与A具有同一性质的子类A1,A2,而抽象工厂确实要负责创建多个类型的类:A1,A2...B1,B2...。

  • 应用场景:

当在一个类中出现多个不同类型类的创建时,而且这些不同类都可以抽象出不同的接口,这是就可以考虑抽象工厂。

  • 例如:我们系统中有Member,和SupperMember,而Member要求Mmeber1:Member要求保存在Access数据库中,Member2:Member要求保存在SqlServer数据库中;

SupperMember要求SupperMember1:SupperMember存储在Access数据库总,而SupperMember2:SupperMember保存在SqlServer数据库中。

  • 分析

我们可以想到该场景适用于创建类型的模式,而有多个不同创品创建的子类,可以想到工厂方法,但是我们这里SupperMember和Member是两个不同的类型的类,这就是说,我么要创建多个不同类型的子类,这无疑最适合的就是抽象工厂了。

  • 实现:

  1. 代码结构:

  2. 代码:

MemberBO.cs

 1 /// <summary>
 2     /// Description of MemberBO.
 3     /// </summary>
 4     public class MemberBO
 5     {
 6         private MemberDaoBase memberDaoBase = null;
 7         
 8         public MemberBO(string dbType)
 9         {
10             if (dbType.ToUpper() == "ACCESS") {
11                 this.memberDaoBase = new MemberAccessDao();
12             } else if (dbType.ToUpper() == "SQLSERVER") {
13                 this.memberDaoBase = new MemberSqlServerDao();
14             } else {
15                 throw new ArgumentOutOfRangeException();
16             }
17         }
18         
19         public MemberBase CreateMember()
20         {
21             return this.memberDaoBase.CreateMember();
22         }
23     
24         public SupperMemberBase CreateSupperMember()
25         {
26             return this.memberDaoBase.CreateSupperMember();
27         }
28     }

MemberDaoBase.cs

1 /// <summary>
2     /// Description of MemberDaoBase.
3     /// </summary>
4     public abstract class MemberDaoBase
5     {
6         public abstract MemberBase CreateMember();
7         
8         public abstract SupperMemberBase CreateSupperMember();
9     }

MemberAccessDao.cs

 1 /// <summary>
 2     /// Description of MemberAccessDao.
 3     /// </summary>
 4     public class MemberAccessDao:MemberDaoBase
 5     {
 6         public MemberAccessDao()
 7         {
 8         }
 9         
10         public override MemberBase CreateMember()
11         { 
12             Console.WriteLine("create member1 in access db");
13             return new Member1();
14         }
15         
16         public override SupperMemberBase CreateSupperMember()
17         {    
18             Console.WriteLine("create suppermember1 in access db");
19             return new SupperMember1();
20         }
21     }
View Code

MemberSqlServerDao.cs

 1 /// <summary>
 2     /// Description of MemberSqlServerDao.
 3     /// </summary>
 4     public class MemberSqlServerDao:MemberDaoBase
 5     {
 6         public MemberSqlServerDao()
 7         {
 8         }
 9         
10         public override MemberBase CreateMember()
11         {
12             Console.WriteLine("create member2 in sqlserver db");
13             return new Member2();
14         }
15         
16         public override SupperMemberBase CreateSupperMember()
17         {
18             Console.WriteLine("create suppermember2 in sqlserver db");
19             return new SupperMember2();
20         }
21     }
View Code

MemberBase.cs

1 public abstract class MemberBase
2     {
3         public int ID{ get; set; }
4     
5         public string Name{ get; set; }
6     }

Member1.cs

1 /// <summary>
2     /// Description of Member1.
3     /// </summary>
4     public class Member1:MemberBase
5     {
6         public Member1()
7         {
8         }
9     }
View Code

Member2.cs

1 /// <summary>
2     /// Description of Member2.
3     /// </summary>
4     public class Member2:MemberBase
5     {
6         public Member2()
7         {
8         }
9     }
View Code

SupperMemberBase.cs

1 /// <summary>
2     /// Description of SupperMember.
3     /// </summary>
4     public abstract class SupperMemberBase
5     {        
6         public int ID { get; set; }
7             
8         public string Name { get; set; }
9     }

SupperMember1.cs

1     /// <summary>
2     /// Description of SupperMember1.
3     /// </summary>
4     public class SupperMember1:SupperMemberBase
5     {
6         public SupperMember1()
7         {
8         }
9     }
View Code

SupperMember2.cs

1 /// <summary>
2     /// Description of SupperMember2.
3     /// </summary>
4     public class SupperMember2:SupperMemberBase
5     {
6         public SupperMember2()
7         {
8         }
9     }
View Code

  3. 调用运行:

 1 class Program
 2     {
 3         public static void Main(string[] args)
 4         {
 5             Console.WriteLine("Hello World!");
 6             
 7             MemberBO memberBO=new MemberBO("Access");
 8             memberBO.CreateMember();
 9             memberBO.CreateSupperMember();
10             
11             memberBO=new MemberBO("SqlServer");
12             memberBO.CreateMember();
13             memberBO.CreateSupperMember();            
14             
15             // TODO: Implement Functionality Here
16             
17             Console.Write("Press any key to continue . . . ");
18             Console.ReadKey(true);
19         }
20     }

  4. 输出:

  • 优缺点:

优点:推迟了子类的创建,实现多种创建的创建,不在局限于一个类型的产品,更加灵活,对子类的创建进行了封装,代码更有层次,逻辑更加清洗,分工明确;

缺点:封装对性能带来性能影响。

posted @ 2014-11-12 17:15  cctext  阅读(252)  评论(0编辑  收藏  举报