现在我们针对抽象工厂实现具体工厂。具体工厂就是利用生产每种产品的单一工厂来组合实现。因此你只要有每种类型的单一工厂就可以直接组合生成抽象工厂,而无需定义一个类来做这件事。注意,对每种数目的抽象工厂接口都需要对应生成一个具体工厂的实现,这里我仅针对生成两个产品的演示:
public class ConcreteFactory<T1, T2> : IAbstractFactory<T1, T2>
{
private IFactory<T1> factory1;
private IFactory<T2> factory2;
public ConcreteFactory(IFactory<T1> f1, IFactory<T2> f2)
{
factory1 = f1;
factory2 = f2;
}
public T1 Create(TypeToken<T1> token)
{
return factory1.Create();
}
public T2 Create(TypeToken<T2> token)
{
return factory2.Create();
}
}
public static class ConcretFactory
{
public static ConcreteFactory<T1, T2> NewFactory<T1, T2>(IFactory<T1> f1, IFactory<T2> f2)
{
return new ConcreteFactory<T1, T2>(f1, f2);
}
}
注意,我又声明了一个没有类型参数的ConcretFactory类,用一个静态方法来生成泛型ConcretFactory的实例,这是因为使用泛型方法可以推测类型参数,使得我们可以不必输入尖括号或Of语句,而泛型类则没有这个功能。现在大功告成!我们用一个例子来演示这个泛型抽象工厂的工作情况。现在假设我们需要一个生产PC的抽象工厂,需要生产两种抽象产品:处理器和内存。处理器和内存的抽象和具体实现如下:
Processor 和 Ram
public abstract class Processor
{
public abstract string Model { get; }
}
public abstract class Ram
{
public abstract int Frequency { get;}
}
public class PentiumProcessor : Processor
{
public override string Model
{
get { return "Pentium Extreme Edition 955"; }
}
}
public class AthlonProcessor : Processor
{
public override string Model
{
get { return "Athlon 64 X2 FX-60"; }
}
}
public class DDRRam : Ram
{
public override int Frequency
{
get { return 400; }
}
}
public class DDR2Ram : Ram
{
public override int Frequency
{
get { return 533; }
}
}
