对《Java与模式》中工场要领模式的异议
副标题#e#
关于工场要领的一点接头,我们知道工场要领属于范例建设模式,而抽象工场属于工具建设模式,而且所谓的类建设模式就是把建设事情延迟到子类,而工具建设模式则将延迟到另一个工具。
而且设计模式中指出,类模式处理惩罚类和子类子间的干系,这些干系通过担任成立,是静态的,在编译时刻便确定下来。工具模式则处理惩罚工具之间的干系,是动态的,运行时刻是可以变革的,更具动态性。
工场要领由于属于范例建设模式,因此它的建设事情由子类完成,而不是利用工具举办建设,而且在《设计模式》中工场要领的念头一节有一个示例,它的类大抵如下:
//抽象产物,可以是接口可能抽象类
public abstract class document {
public void open(){
...............
...............
}
public void close(){
...............
...............
}
public void save();
}
//详细的产物,
public class Mydocument extends document{
public void open(){
.............
..............
}
...............
}
我们工场要领
public abstract class appliaction {
//该要领是工场要领,由子类实现
public abstract document createDocument();
//模板要领,在要领中利用了工场要领
pubic void newDocument(){
//利用工场要领,得到doc,而实际有子类完成,//这里可以看出,工具的建设,是通过担任来实现,是静态的,编译时已经确定//而不是通过工具的委托来实现,故属于类建设型模式
Document doc=createDocument();
doc.open();
....................
doc.save();
}
}
详细的工场实现由子类来实现工场要领:
public class myappliaction extends appliaction {
public document createDocument(){
return new Mydocument();
}
}
#p#副标题#e#
各人可以看出,这其实利用template method模式,抽象要领声明建设工具,而模板要领完成业务逻辑,她利用抽象建设要领,由担任来得到产物,而不是利用工具来建设工具的。
而且各人仔细看<设计模式>71页的布局图,里的creator里有两个要领,个中一个利用factorymethod要领,别的一个就是普通的要领,anOperation它挪用了工场要领,product=factorymethod()来得到产物工具。
此刻问题就呈此刻这里,而别的一本书阎宏的《java与模式》的167地布局图中却没有把这点作出标志,而且提供的示例,也不像最初<设计模式>中的工场要领的例子,
他的示譬喻下:
//抽象工场,而这里却没有要领利用工场要领:
public interface Creator{
/**
* 工场要领
*/
public Product factory();
}
public class ConcreteCreator1 implements Creator
{
/**
* 工场要领
*/
public Product factory()
{
return new ConcreteProduct1();
}
}
而客户端却利用;
public static void main(String[] args){
creator1 = new ConcreteCreator1();
prod1 = creator1.factory();
}
我感受这样示例有问题,可能不当,可能不能表达原意。
在客户端,他的工具建设利用了
prod1 = creator1.factory();
这样显然利用工具creator1来建设工具的,而不是利用担任,类模式来完成建设的。这与工场要领的原意,类模式,把建设工场延迟到子类实现,等有斗嘴。
这样想工具建设模式。