• 定义:

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

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

例如:工厂方法创建与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. 代码结构:

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

  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

相关文章: