#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的具体工厂的实现

最新文章

  1. spring web MVC
  2. js 获取时间差
  3. =============Python安装与使用================
  4. mysql开启远程访问
  5. android textview 跑马灯
  6. hadoop的核心思想
  7. BZOJ1600: [Usaco2008 Oct]建造栅栏
  8. 【Java】集合_Collections_学习记录
  9. BaseAdapter的ArrayIndexOutOfBoundsException
  10. IOS 开发之文件管理
  11. duilib开源界面库
  12. Dom-创建标签
  13. 第4章 同步控制 Synchronization ----互斥器(Mutexes)
  14. linux基础-系统安装教程篇(centos6.5)
  15. 值得注意的CSS属性
  16. [目录]C#学习笔记
  17. SpringBoot打包不同配置profile
  18. Compiling R-3.4.3 on CentOS 6.10 with GNU
  19. GBK 字符集
  20. Unity 3D中ToLua-UGUI使用说明、导入Unity流程、制作登陆界面

热门文章

  1. java中break和continue跳出指定循环(转载)
  2. 使用jQuery+huandlebars遍历展示对象中的数组
  3. IIS8.0 部署WCF Services
  4. shiro 认证思路
  5. Docker 批量启动
  6. slot 插槽的使用
  7. Spring AOP @Aspect
  8. Shader基础(渲染管线)
  9. 【C++】正则表达式引擎学习心得
  10. lucene笔记