全球旧事资料 分类
交换产品系列一个具体工厂类在一个应用中仅出现一次即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。在我们的用户界面的例子中,我们仅需转换到相应的工厂对象并重新创建接口,就可实现从Motif窗口组件转换为Prese
tatio
Ma
ager窗口组件。3它有利于产品的一致性当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要。而AbstractFactory很容易实现这一点。4难以支持新种类的产品难以扩展抽象工厂以生产新种类的产品。这是因为AbstractFactory接口确定了可以被创建的产品集合。支持新种类的产品就需要扩展该工厂接口,这将涉及AbstractFactory类及其所有子类的改变。我们会在实现一节讨论这个问题的一个解决办法。9实现下面是实现AbstractFactor模式的一些有用技术:1将工厂作为单件一个应用中一般每个产品系列只需一个Co
creteFactory的实例。因此工厂通常最好实现为一个Si
gleto
(35)。2创建产品AbstractFactory仅声明一个创建产品的接口,真正创建产品是由Co
creteProduct子类实现的。最通常的一个办法是为每一个产品定义一个工厂方法(参见FactoryMethod33)。()一个具体的工厂将为每个产品重定义该工厂方法以指定产品。虽然这样的实现很简单,但它却要求每个产品系列都要有一个新的具体工厂子类,即使这些产品系列的差别很小。
f如果有多个可能的产品系列,具体工厂也可以使用Prototype(34)模式来实现。具体工厂使用产品系列中每一个产品的原型实例来初始化,且它通过复制它的原型来创建新的产品。在基于原型的方法中,使得不是每个新的产品系列都需要一个新的具体工厂类。此处是Smalltalk中实现一个基于原型的工厂的方法。具体工厂在一个被称为partCatalog的字典中存储将被复制的原型。方法make:检索该原型并复制它:
makepartNamepartCatalogatpartNamecopy
具体工厂有一个方法用来向该目录中增加部件。
addPartpartTemplate
amedpartNamepartCatalogatpartNameputpartTemplate
原型通过用一个符号标识它们,从而被增加到工厂中:
aFactoryaddPartaPrototype
amedACMEWidget
在将类作为第一类对象的语言中(例如Smalltalk和ObjectiveC),这个基于原型的方法可能有所变化。你可以将这些语言中的r
好听全球资料 返回顶部