使用泛型建立井筒曲线图道工厂

2015-07-03 09:27孙斌
中国科技纵横 2015年12期
关键词:数据类型

孙斌

【摘 要】当我们需要写功能相似函数过程,同时可处理int、string、Date或其它数据类型时,因方法参数类型不同,只能分别写多个重载函数过程处理每种数据类型。如能在方法中传入通用数据类型,就可合并代码。这就自然而然的引入了泛型概念。通过介绍使用泛型的优点,说明使用泛型原因,结合井筒曲线图道类生成,说明使用泛型建立抽象工厂方法。

【关键词】数据类型 泛型 实例和实例化

1 泛型定义和优点

泛型是一种通用的数据类型。泛型可通过反射获取泛型数据类型中使用的类型信息。泛型最常见的用途是创建集合类。.NET类库在System.Collections.Generic命名空间中包含几个新的集合类。

使用泛型可方便高效的重用代码,当需要实现时,再进行处理。在.NET中使用泛型,它的数据类型和内部数据可在不导致增加代码情况下更改,而不管使用的是值类型还是引用类型,都可一次性地编写,并进行测试和系统部署,可通过任何类型来重用它,且都具有类型安全特性。因一般代码不会强行对值类型进行装箱和取消装箱,或对引用类型进行向下强制类型转换,所以使我们的程序性能得到显著提高。

2 实际应用

以井筒曲线图道类工厂为例,建立一个泛型抽象工厂。

(1)定义一个图道类工厂方法,实现一个采用无参数构造函数来创建对象的工厂WellTrackFactory,代码如下:

public class WellTrackFactory : IWellTrackFactory where TTrack : TAbstractTrack, new(){public TAbstractTrack Create(){ return new TTrack(); }}

(2)解决方法重载问题,引入TypeToken类型,定义如下:

public sealed class TypeToken{

static private TypeToken instanceValue = new TypeToken();

static public TypeToken Instance{ get { return instanceValue; }}

private TypeToken() { }}

这个类没有成员,且每个类型实参只能创建一个实例,因此性能较高。但就因该实例上带有其类型实参的类型信息,因此可作为判断函数重载依据。下面就用TypeToken作为区分生产函数重载依据,定义一个生产两种图道类的抽象工厂接口,实现如下:

public interface IAbstractFactory{

T1 Create(TypeToken token); T2 Create(TypeToken token);}

(3)针对抽象工厂实现具体工厂。具体工厂是利用生产每种图道类型单一工厂来组合实现。因此只要有每种图道类型单一工厂就可直接组合生成抽象工厂,而无需定义一个专用类来生成图道。代码如下:

public class FactTrackFactory : IAbstractFactory

{private IWellTrackFactory factory1;

private IWellTrackFactory factory2;

public FactTrackFactory(IFactory f1, IWellTrackFactory f2)

{factory1 = f1;factory2 = f2;}public T1 Create(TypeToken token)

{return factory1.Create();}public T2 Create(TypeToken token)

{return factory2.Create(); }}public static class FactTrackFactory

{public static FactTrackFactory NewFactory

T2>(IWellTrackFactory f1, IWellTrackFactory f2)

{return new FactTrackFactory(f1, f2); }}

(4)建立实例使用这个泛型抽象工厂。以曲线型图道为例,代码如下:

//曲线型图道public abstract class CurveWellTrack{

public abstract string TrackName { get; }//图道名称

public abstract string TrackCaption { get; }//图道图头标题 }

下面就可以随意生成所需的抽象工厂接口,并快速从现有的单独图道工厂组合成特定的具体工厂实现。先定义一个生产图道类的方法:

public static IAbstractFactory WellTrackFactory(string type){if (type == "Line"){

return FactTrackFactory.NewFactory(new

WellTrackFactory(),new WellTrackFactory());

}else if (type == "Rect"){return FactTrackFactory.NewFactory(new WellTrackFactory(),new WellTrackFactory());} return null; }

(5)将生产出的图道信息,输出到窗体中:

public static void ExportProduct(ListBox lb)

{//生产两个类型图道IAbstractFactory factory1 = WellTrackFactory("Line");CurveWellTrack track1 = factory1.Create(TypeToken.Instance);

ImageWellTrack track2 = factory1.Create(TypeToken.Instance);

lb.Items.Add("图道1" + track1.TrackName);lb.Items.Add(track1.TrackCaption);

lb.Items.Add("图道2" + track2.TrackName);lb.Items.Add(track2.TrackCaption);}

3 结语

文章简单介绍了泛型的定义以及优点,并结合井筒曲线的图道类的生成,说明了用泛型技术成功地增强原本重用性较低的抽象工厂的原理,演示了泛型在提高抽象性和代码重用方面卓越的价值。

猜你喜欢
数据类型
详谈Java中的基本数据类型与引用数据类型
如何理解数据结构中的抽象数据类型
范畴数据类型上的子类型*