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

c#设计模式3抽象工厂模式(Abstract Factory)的更多相关文章

  1. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  2. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  3. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  4. 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern

    概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...

  5. 设计模式之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...

  6. 设计模式 笔记 抽象工厂模式 Abstract Factory

    //---------------------------15/04/09---------------------------- //Abstract Factory 抽象工厂----对象创建型模式 ...

  7. .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)

    概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...

  8. 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

    抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...

  9. 抽象工厂模式(Abstract Factory)C#实例

    抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 ...

  10. 浅谈C++设计模式之抽象工厂(Abstract Factory)

    抽象工厂(Abstract Factory)模式是为了提供一系列相关或相互依赖对象的接口.对象创建型模式的一种. 客户Client 抽象工厂接口AbstractFactory 抽象工厂的实现类Conc ...

随机推荐

  1. [PHP]将回调函数作用到给定数组的单元上

    ---------------------------------------------------------------------------------------------------- ...

  2. jQuery中事情的动态绑定

    在jQuery的开发过程中,我们往往需要处理各种事件,例如click(),hover()等.在jQuery的API中,我们可以使用不同的方法来将这些事件绑定到特定的元素中.今天这篇文章中,我们将要介绍 ...

  3. 通用坐标投影转换器Uneversal Coord Transformer

    关键词:投影,重投影,坐标转换,坐标系,空间参考,北京54,西安80,中国2000,WGS84,UTM,墨卡托,网络墨卡托 软件名称:通用坐标投影转换器Uneversal Coord Transfor ...

  4. Nginx搭建hls流媒体服务器

    第一种方案:ffmpeg+nginx   新的ffmpeg已经支持HLS.(本人也参与了代码供献,给自己做个广告:))   点播:   生成hls分片:   ffmpeg -i <媒体文件> ...

  5. intellij idea 搜索功能快捷键

    intellij idea是一款超智能的编译器,因此在信息资源的搜索功能中给我们的用户提供了很大的帮助.同样作为java编译器的eclipse和myeclipse在搜索方面就比intellij ide ...

  6. GitLab 汉化

    汉化Gitlab Gitlab默认语言是英文,对于想加强英文的同学,建议继续使用英文,但要求使用中文,这里需要下载一个汉化包下载最新的汉化包: 下载最新的汉化包: [root@gitlab ~]# g ...

  7. iftop网络流量查看工具

    1.下载iftop源码包 mkdir /usr/local/src/iftop cd /usr/local/src/iftop wget http://www.ex-parrot.com/~pdw/i ...

  8. mysql 多行合并一行

    SELECT `w`.`id` AS `id`, `w`.`phone` AS `phone`, `w`.`belong_id` AS `belong_id`, `w`.`name` AS `name ...

  9. Python基础之Python分类

    python环境 编译型: 一次性将所有程序编译成二级制文件,开发效率极低,因为一旦出现BUG所有的程序需要全部重新编译 缺点: 开发效率低,不能跨平台 优点: 执行速度快 解释型: 当程序执行时,一 ...

  10. 无法加载DLL"***.dll":找不到指定的模块

    加载dll的路径不对. 绝对路径不合适,可以换成相对路径. 比如: 把dll放入bin目录下的debug或者release下,然后就可以直接“test.dll”了.不用加路径了. 注意:路径必须与发布 ...