- 定义:
抽象工厂同工厂方法有相似处:都提供了对子类创建的封装,都是有工厂方法的接口实现类的中决定了子类被创建为什么对象。
不同于工厂方法之处:工厂方法创建的对象只是一个类型的子类,而抽象工厂创建的对象为多个类型的不同类。
例如:工厂方法创建与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 }