抽象工厂(Abstract Factory)模式可能是程序员最熟悉的设计模式了,平常好像也没有哪位大侠来谈论这个(可能是害怕掉价吧),特别是在.NET开发平台下,抽象工厂的光芒早已被反射技术所掩盖,抽象工厂模式的地位逐渐下降,慢慢的淡出了我们的视线。
抽象工程模式的意图是提供一个创建一些相互关联或者相互依赖的对象或者对象族的接口。使用抽象工厂的最主要目的是剥离了对象的消费者和具体对象之间的依赖关系,从而可以保证了在不触及对象的消费者的情况下改变对象。
使用抽象工厂的一个关键点或者说必要条件是需要创建的对象是相关的或者互相依赖的。例如,一个随机图片生产工厂,需要创建图片需要的背景了前景,接口如下:
public interface IStageFactory
{
public IBackground CreateBackground();
public IForeground CreateForeground();
}
由于在此种场景下创建的两个对象直接存在相关性,不可能让一条鱼的前景显示到沙漠的背景上。
如果创建的对象之间没有相关性或者依赖关系,那么就一定不要使用抽象工厂,因为在这种应用场景中抽象工厂属于一个杂凑体,将不必要的依赖关系引入到工厂接口的消费者(也许某一个工厂的使用类压根就不需要依赖工厂创建的某个类型),并且不满足单一职责原则。此外,由于程序员的懒惰有可能将更多不必要的类型创建职责揉合到工厂接口中。
但是,如果创建的对象存在相关性或者相互依赖,那么最好使用抽象工厂模式,虽然通过反射可以达成相同的目的,但是反射的约束不是强制的,很可能在配置信息中引入错误,导致难以追踪和发现的Bug。