zoukankan      html  css  js  c++  java
  • 设计模式(三)(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. 输出:

    • 优缺点:

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

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

  • 相关阅读:
    范仁义网站刷题教程
    心得体悟帖---200115(对人要好)(浪费时间可耻)
    心得体悟帖---200114(解决问题啊)(解决问题)
    legend3---laravel缓存操作基本使用实例
    JS动态修改页面EasyUI datebox不生效、EasyUI动态添加Class、EasyUI动态渲染解析解决方案
    Java正则表达式入门
    Android中scrollview的scrollto方法不起作用的办法
    Android中监听ScrollView滑动停止和滑动到底部
    视频
    Android Scroller类的详细分析
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/4092777.html
Copyright © 2011-2022 走看看