资源大全 | 神秘文化 | 在线翻译 | QQ专区 | 视频教程 | 彩信频道 | 搜索引擎 | BT下载 |  | 网站地图
设为首页
加入收藏
联系站长
您现在的位置: 一百网络 >> JSP编程 >> 设计模式 >> 文档正文
最近更新
普通文档 用Reflection实现Visito
普通文档 使用Factory Method模式
普通文档 Java Tip: 实现Command模
普通文档 Java Tip: 实现Command模
普通文档 简析J2EE应用程序数据库
普通文档 在EJB环境中实现“观察者
普通文档 EJB设计模式(1)
普通文档 Builder Pattern(Builde
普通文档 decorator 模式
普通文档 Prototype 模式
推荐文章
  • 此栏目下没有推荐文档
  • 使用Factory Method模式

    文章作者:佚名 录入时间:2006-7-3 来源:不详
    网站声明:本站的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出处和原始作者,文章版权归本网站与文章作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。


    Q: 阅读 "Polymorphism in its purest form" 一文时,我看到了一个不熟悉的术语 "Factory method"。你能解释一下什么是Factory method并说明如何使用它吗?

    A: Factory method(工厂方法)只不过是实例化对象的一种方法的名称。就象工厂一样,Factory method的任务是创建--或制造--对象。

    让我们看一个例子。

    每个程序要有一种报错的方式。看看下面的接口:

    代码清单1
    public interface Trace {

    // turn on and off debugging
    public void setDebug( boolean debug );

    // write out a debug message
    public void debug( String message );

    // write out an error message
    public void error( String message );

    }

    假设写了两个实现。一个实现(代码清单3)将信息写到命令行,另一个(代码清单2)则写到文件中。

    代码清单2
    public class FileTrace implements Trace {

    private java.io.PrintWriter pw;
    private boolean debug;

    public FileTrace() throws java.io.IOException {
    // a real FileTrace would need to obtain the filename somewhere
    // for the example I´ll hardcode it
    pw = new java.io.PrintWriter( new java.io.FileWriter( "c:\trace.log" ) );
    }

    public void setDebug( boolean debug ) {
    this.debug = debug;
    }

    public void debug( String message ) {
    if( debug ) { // only print if debug is true
    pw.println( "DEBUG: " + message );
    pw.flush();
    }
    }
    public void error( String message ) {
    // always print out errors
    pw.println( "ERROR: " + message );
    pw.flush();
    }

    }

    代码清单3
    public class SystemTrace implements Trace {

    private boolean debug;

    public void setDebug( boolean debug ) {
    this.debug = debug;
    }

    public void debug( String message ) {
    if( debug ) { // only print if debug is true
    System.out.println( "DEBUG: " + message );
    }
    }
    public void error( String message ) {
    // always print out errors
    System.out.println( "ERROR: " + message );
    }

    }

    要使用这两个类中的任一个,需要这样做:

    代码清单4
    //... some code ...
    SystemTrace log = new SystemTrace();
    //... code ...
    log.debug( "entering loog" );
    // ... etc ...

    现在,如果想改变程序中用到的 "Trace实现",就需要修改实例化 "Trace实现" 的每个类。使用了Trace的类的数量可能很多,这种修改就需要大量的工作。而且,你一定也想尽可能地避免大量修改你的类。

    代码清单5
    public class TraceFactory {
    public static Trace getTrace() {
    return new SystemTrace();
    }
    }

    getTrace()是一个Factory method。这样,无论什么时候你想得到一个Trace的引用,只用简单地调用TraceFactory.getTrace():

    代码清单6
    //... some code ...
    Trace log = new TraceFactory.getTrace();
    //... code ...
    log.debug( "entering loog" );
    // ... etc ...

    使用Factory method来获得实例可以大量节省以后的工作。上面的代码中,TraceFactory返回的是SystemTrace实例。假设需求发生了变化,需要将信息写到文件中。如果是使用Factory method来获得实例,只用在一个类中修改一次就可以满足新的需求。你就不用在使用了Trace的的每个类中进行修改了。也就是说,只用简单地重定义getTrace():

    代码清单7
    public class TraceFactory {
    public static Trace getTrace() {
    try {
    return new FileTrace();
    } catch ( java.io.IOException ex ) {
    Trace t = new SystemTrace();
    t.error( "could not instantiate FileTrace: " + ex.getMessage() );
    return t;
    }
    }
    }

    当不能确定一个类的什么具体实现要被实例化时,Factory method会很有用。你可以将那些细节留给Factory method。

    在上面的例子中,你的程序不知道要创建FileTrace还是SystemTrace。因而,你可以只是用Trace来处理对象,对具体实现的实例化则留给Factory method。

  • 上一篇文档:

  • 下一篇文档:
  •     查找更多“使用Factory Method模式”的内容  
    相关连接
  • 用Reflection实现Visitor模式

  • Java Tip: 实现Command模式(2)

  • Java Tip: 实现Command模式(1)

  • 简析J2EE应用程序数据库类设计模式

  • 在EJB环境中实现“观察者”模式