假设程序开发分成2层,第一层是FrameWork,第二层是Application。一个FrameWork可以在多个Application中使用。这样,FrameWork需要独立于Application,即FrameWork不应该需要看到Application的接口。
假设FrameWork需要使用到一个类AbstractA,Application以AbstractA为基类设计派生类ConcreteA。
1,如果ConcreteA对象是由Application创建(Create)的,那么只要使用继承就可以了。不同的Application设计不同的ConcreteA,把ConcreteA对象的指针或者引用作为AbstractA传递给FrameWork就可以了。
2,如果ConcreteA对象是需要FrameWork创建的,那么可以考虑FactoryMethod。不同的Application设计不同的ConcreteA,以及相应的ConcreteCreatorA。Application把ConcreteCreatorA对象的指针或者引用作为AbstactCreatorA传递给FrameWork,FrameWork通过AbstactCreatorA的FactoryMethod创建ConcreteA对象。
3,比FactoryMethod更进一步,如果Application中需要多个AbstractA的派生类,比如ConcreteA1,ConcreteA2,ConcreteAn。为了避免需要相应的同样多的ConcreteCreatorA1,ConcreteCreatorA2…ConcreteCreatorAn,可以考虑Prototype。这样,Application只需要一个ConcreteCreatorA就可以创建多个AbstractA的派生类对象ConcreteA1,ConcreteA2…ConcreteAn。
4,如果一系列的AbstractA,AbstractB…AbstractN,相应的派生类对象都需要FrameWork创建。可以考虑AbstractFactory。AbstractFactory中可以采取FactoryMethod,也可以采取Prototype。
5,一般来说,AbstractFactory中的ConcreteFactory经常是Singleton。