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的具体工厂的实现
c#设计模式3抽象工厂模式(Abstract Factory)的更多相关文章
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- 【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
- 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...
- 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern
概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...
- 设计模式之抽象工厂模式(Abstract Factory Pattern)
一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...
- 设计模式 笔记 抽象工厂模式 Abstract Factory
//---------------------------15/04/09---------------------------- //Abstract Factory 抽象工厂----对象创建型模式 ...
- .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)
概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...
- 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释
抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...
- 抽象工厂模式(Abstract Factory)C#实例
抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 ...
- 浅谈C++设计模式之抽象工厂(Abstract Factory)
抽象工厂(Abstract Factory)模式是为了提供一系列相关或相互依赖对象的接口.对象创建型模式的一种. 客户Client 抽象工厂接口AbstractFactory 抽象工厂的实现类Conc ...
随机推荐
- KVM虚拟化技术(五)虚拟机管理
一.为了提高内存.硬盘.网络的性能,需要支持半虚拟化:virtio半虚拟化驱动 二.对虚拟机的管理都是通过libvirt:所有必须要启用一个守护程序libvirtd. 三.virt-manager ① ...
- Eclipse代码自动补全
Eclipse自动补全方法 Window -> preferences -> Java -> Editor -> Content assist -> Auto-Activ ...
- 让Hibernate和触发器协同工作
Sql Server触发器和hibernate一起使用时经常报类似如下错误 Batch update returned unexpected row count from update [0] ...
- 20.struts2的数据填充和类型转换.md
目录 1. struts2的自动填充 2. struts2的对象填充 3. struts2的类型转换器 3.1 类继承关系 3.2 局部转换器 3.3 全局转换器 3.4 注意 1. struts2的 ...
- Jetty-attack-test
import httplib, urllib, ssl, string, sys, getopt from urlparse import urlparse ''' Author: Gotham Di ...
- Uni2D 入门 -- Asset Table
转载 http://blog.csdn.net/kakashi8841/article/details/17686791 Uni2D生成了一个自定义的表格用于保存你资源的唯一ID的引用.这个表格用于更 ...
- SPSS-方差分析
方差分析(单因素方差分析.多因素方差分析.协方差分析) 基本概念:进行两组以上均数的比较,检验两个或两个以上样本均数差别的显著性(T检验主要是检验两个样本均数差别的显著性) ...
- java 素数(按要求输出)
package number; import java.util.Scanner; public class Prime { public static void main(String[] args ...
- html中表单的应用
2.表单 ***** 表单作用: 用于显示.收集信息,并将信息提交到服务器 表单两大部分: 1.实现数据交互的可见界面元素,即表单控件 2.提交表单后的处理操作 1.如何实现表单 语法:<for ...
- 解题(StringJiaMi--字符串加密)
题目描述 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙.下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS.如果单词中包含有重复的字母,只保留第1个,其余几个丢弃. ...