问答题 第1题、在这一节和上一节的类图中,我注意到Apple类的类图与Strawberry类的类图有一点点不同。在Apple类的类图左上角有一个夹子样的标识。请问这个标识代表什么意思。
第2题、在这一节的类图4中,我注意到 ConcreteProduct 类只出现一次,但实现 Product 接口的类实际上可以有很多。这是否可以用在联接 Product 和 ConcreteProduct 之间的线旁注上 1,2,... 表示呢? 记得我在UML图中曾见过这种记号。
第3题、请问在本节的小花果园系统的源代码清单4里,Broccoli 类实现两个接口,VeggieIF 和 PlantIF。只有 PlantIF 才与工厂模式有关。为什么不把 VeggieIF 接口合并到 PlantIF 接口中去?
第4题、请问在工厂方法模式中,产品(Product) 何时应是抽象类,何时应是接口?
第5题、请问在工厂方法 (factory())中,为什么要使用 if 语句作过程性判断来决定创立哪一个产品类,而不使用多形性原则 (Polymorphsm) 来创立产品类?
问答题答案 第1题、Apple类有性质(property),而Strawberry类没有性质。
一个类的成员变量叫做属性(attribute)。性质与属性的区别在于性质是带着一套取值丶赋值方法的属性。一个类有了属性,其类图左上角就会有一只夹子。有些人认为,一个爪哇类有了属性才能被称做爪哇豆(Java Bean)。这只夹子就表示这个类是一只豆。
一个企业爪哇豆,或 EJB (Enterprise JavaBean) 的类图左上角也会有一只夹子,夹子上面有一个E字以示与普通的爪哇豆的不同(请见下图)。
第2题、不能。在图4中联接 Product 和 ConcreteProduct 之间的线有两条,一条表示两者之间的推广关系 (即有向上箭头的),另一条表示两者之间的关联关系(即有向下箭头的)。在推广关系线旁写数字没有意义。在关联关系线旁写数字是有意义的,类旁的数字可以表明类的实例的数目。
原来的问题是关于类的数目而不是类的实例的数目,因此是错的。
没有任何必要用数字标明这一点,而且UML也不提供这种标记。
第3题、在面向对象的编程,特别是爪哇语言的编程中,接口常常用来标志一种身份(identity)。 VeggieIF 和 PlantIF 接口代表两种不同的身份。VeggieIF 表明 Broccoli 类属于蔬菜类等级, PlantIF 接口表明 Broccoli 类属于工厂的产品类。
因此,虽然把两个接口合并起来可能在功能上是行得通的,在原则上是不应鼓励这样做的。
第4题、在工厂方法模式中,产品(Product)可以永远是抽象类。但在一些情形下可仪简化为接口。
如果所实产品类( Concrete Product) 之间有共同的逻辑,这部分公有的代码就应当转移到产品 (Product) 中去,这样产品就必须是抽象类而不可能是接口。
反过来,如果所实产品类( Concrete Product) 之间没有任何共同的逻辑,那么产品(Product)就没有任何逻辑代码,它就应当被作为接口,而不是抽象类。但这不是必须的,仅是建议而已。
第5题、多形性原则 (Polymorphism) 是在对象被创立之后才存在的,因此不能使用多形性来创立对象。factory() 方法必然是非常过程性 (procedural)的。