zoukankan      html  css  js  c++  java
  • c#设计模式3抽象工厂模式(Abstract Factory)

      #region 坦克系列
        abstract class Tank
        {
            abstract public void Go();
        }
        /// <summary>
        /// 越野车
        /// </summary>
        class YueyeTank : Tank
        {
            public override void Go()
            {
                Console.WriteLine("我是一颗中国造越野车,来踏平不老实的小邪恶国家!");
            }
        }
        /// <summary>
        /// 主站坦克
        /// </summary>
        class ZhuzhanTank : Tank
        {
            public override void Go()
            {
                Console.WriteLine("我是一颗中国造主站坦克,来踏平不老实的小邪恶国家!");
            }
        }
        #endregion
     #region 炸弹系列
        abstract class Bomb
        {
            abstract public void BaoZha();
        }
        /// <summary>
        /// 导弹
        /// </summary>
        class DaodanBomb : Bomb
        {
            public override void BaoZha()
            {
                Console.WriteLine("我是一颗中国造导弹,来轰炸不老实的小邪恶国家!");
            }
        }
        /// <summary>
        /// 核弹
        /// </summary>
        class HedanBomb : Bomb
        {
            public override void BaoZha()
            {
                Console.WriteLine("我是一颗中国造核弹,来轰炸不老实的小邪恶国家!");
            }
        }
        #endregion
     // 备战
        class Make
        {
            //装备 
            private Bomb bomb;
            private Tank tank;
            //制造加工
            public Make(ChinaFactory factory)
            {
                bomb = factory.CreateBomb();
                tank = factory.CreateTank();
            }
    
            //开始打仗
            public void WarStar()
            {
                //炸弹类爆炸
                bomb.BaoZha();
                //战车类前进
                tank.Go();
            }
    
        }
     #region 中国兵工厂
        abstract class ChinaFactory
        {
            //装甲车制造车间
            public abstract Tank CreateTank();
            //炸弹知道车间
            public abstract Bomb CreateBomb();
        }
        //兵工厂前期制造
        class QianqiFactory : ChinaFactory
        {
            public override Bomb CreateBomb()
            {
                //导弹
                return new DaodanBomb();
            }
            public override Tank CreateTank()
            {
                //越野车
                return new YueyeTank();
            }
        }
        //兵工厂后期制造
        class HouqiFactory : ChinaFactory
        {
            public override Bomb CreateBomb()
            {
                //核弹
                return new HedanBomb();
            }
            public override Tank CreateTank()
            {
                //主站坦克
                return new ZhuzhanTank();
            }
        }
        #endregion
      class Program
        {
            static void Main(string[] args)
            {
                //大战前期
                ChinaFactory qianqiMake = new QianqiFactory();
                Make qianqi = new Make(qianqiMake);
                qianqi.WarStar();
    
                //点任意键,进行后期攻势!!
                Console.ReadKey();
    
                //大战后期
                ChinaFactory houqiMake = new HouqiFactory();
                Make houqi = new Make(houqiMake);
                houqi.WarStar();
    
                Console.WriteLine("钓鱼岛是中国的,神圣不可侵犯!小邪恶国家,滚开!!");
                Console.ReadLine();
    
            }
        }

    这里首先以一个生活中抽象工厂的例子来实现一个抽象工厂,
    然后再给出抽象工厂的定义和UML图来帮助大家更好地掌握抽象工厂模式,
    同时大家在理解的时候,可以对照抽象工厂生活中例子的实现和它的定义来加深抽象工厂的UML图理解。
    抽象工厂模式比其它工厂模式更加抽象,抽象工厂模式适用与多个抽象类的情况下,
    通过工厂返回多个抽象类中你需要得到的具体子类实例。

    举例阐述抽象工厂模式:
    假如中国对邪恶国家开战。

    中国装备:炸弹类,坦克类,来消灭邪恶国家。

    炸弹类:导弹,核弹;

    坦克类:越野车,主站坦克;

    战略:

    前期中国兵工厂生产:导弹,越野车,打击邪恶国家。

    后期中国兵工厂生产:核弹,主站坦克,毁灭邪恶国家。

    NEW 对象实例时, 就像工厂内生产出的新产品,  程序中与现实贯通

    .NET中抽象工厂模式实现
    抽象工厂模式在实际中的应用也是相当频繁的,然而在我们.NET类库中也存在应用抽象工厂模式的类,这个类就是System.Data.Common.DbProviderFactory,这个类位于System.Data.dll程序集中,该类扮演抽象工厂模式中抽象工厂的角色,我们可以用reflector反编译工具查看该类的实现:

    /// 扮演抽象工厂的角色
    /// 创建连接数据库时所需要的对象集合,
    /// 这个对象集合包括有 DbConnection对象(这个是抽象产品类,如绝味例子中的YaBo类)、DbCommand类、DbDataAdapter类,针对不同的具体工厂都需要实现该抽象类中方法,
    public abstract class DbProviderFactory
    {
      // 提供了创建具体产品的接口方法
      protected DbProviderFactory();
      public virtual DbCommand CreateCommand();
      public virtual DbCommandBuilder CreateCommandBuilder();
      public virtual DbConnection CreateConnection();
      public virtual DbConnectionStringBuilder CreateConnectionStringBuilder();
      public virtual DbDataAdapter CreateDataAdapter();
      public virtual DbDataSourceEnumerator CreateDataSourceEnumerator();
      public virtual DbParameter CreateParameter();
      public virtual CodeAccessPermission CreatePermission(PermissionState state);
    }
    DbProviderFactory类是一个抽象工厂类,该类提供了创建数据库连接时所需要的对象集合的接口,实际创建的工作在其子类工厂中进行,微软使用的是SQL Server数据库,因此提供了连接SQL Server数据的具体工厂实现,具体代码可以用反编译工具查看,具体代码如下:
     
    /// 扮演着具体工厂的角色,用来创建连接SQL Server数据所需要的对象
    public sealed class SqlClientFactory : DbProviderFactory, IServiceProvider
    {
      // Fields
      public static readonly SqlClientFactory Instance = new SqlClientFactory();
      // 构造函数
      private SqlClientFactory()
      {
      }
           
      // 重写抽象工厂中的方法
      public override DbCommand CreateCommand()
      { // 创建具体产品
        return new SqlCommand();
      }
      public override DbCommandBuilder CreateCommandBuilder()
      {
        return new SqlCommandBuilder();
      }
      public override DbConnection CreateConnection()
      {
        return new SqlConnection();
      }
      public override DbConnectionStringBuilder CreateConnectionStringBuilder()
      {
        return new SqlConnectionStringBuilder();
      }
      public override DbDataAdapter CreateDataAdapter()
      {
        return new SqlDataAdapter();
      }
      public override DbDataSourceEnumerator CreateDataSourceEnumerator()
      {
        return SqlDataSourceEnumerator.Instance;
      }
      public override DbParameter CreateParameter()
      {
        return new SqlParameter();
      }
      public override CodeAccessPermission CreatePermission(PermissionState state)
      {
        return new SqlClientPermission(state);
      }
    }

    因为微软只给出了连接SQL Server的具体工厂的实现,我们也可以自定义连接Oracle、MySql的具体工厂的实现

  • 相关阅读:
    uTenux-OS-Task再探
    uTenux——LED驱动讲解
    uTenux——HelloWord
    uTenux——重新整理底层驱动库
    template的超级bug
    [LeetCode] Integer to Roman
    [LeetCode] Roman to Integer
    [LeetCode]Flatten Binary Tree to Linked List
    [LeetCode] LRU Cache [Forward]
    [LeetCode] Reorder List
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/8875262.html
Copyright © 2011-2022 走看看