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