设计模式(三)(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 }
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 }
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 }
Member2.cs
1 /// <summary> 2 /// Description of Member2. 3 /// </summary> 4 public class Member2:MemberBase 5 { 6 public Member2() 7 { 8 } 9 }
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 }
SupperMember2.cs
1 /// <summary> 2 /// Description of SupperMember2. 3 /// </summary> 4 public class SupperMember2:SupperMemberBase 5 { 6 public SupperMember2() 7 { 8 } 9 }
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. 输出:
- 优缺点:
优点:推迟了子类的创建,实现多种创建的创建,不在局限于一个类型的产品,更加灵活,对子类的创建进行了封装,代码更有层次,逻辑更加清洗,分工明确;
缺点:封装对性能带来性能影响。
基础才是编程人员应该深入研究的问题,比如:
1)List/Set/Map内部组成原理|区别
2)mysql索引存储结构&如何调优/b-tree特点、计算复杂度及影响复杂度的因素。。。
3)JVM运行组成与原理及调优
4)Java类加载器运行原理
5)Java中GC过程原理|使用的回收算法原理
6)Redis中hash一致性实现及与hash其他区别
7)Java多线程、线程池开发、管理Lock与Synchroined区别
8)Spring IOC/AOP 原理;加载过程的。。。
【+加关注】。