`

Factory Method 工厂模式

 
阅读更多

转自:http://blog.csdn.net/zigzagsoft/article/details/2639606

 

模式定义

Factory Method工厂方法模式定义了个一个用于创建一系列对象的抽像接口,让它的每一个子类来决定具体实例化哪个类。它使得一个类的实例化延迟到了子类中实现。

 

使用范围

  • 当某个类不知道它所创建的类属于何种对象的时候
  • 当某个类希望由它的子类来指定它所创建的对象的时候

使用方法

先看一个类结构图:

Product是一个产品类,包含了多个需要实例化的子类,比如ConcreteProduct。Creator是一个工厂,专门用来生产Product,它包含了一个抽像方法FactoryMethod(),该方法被下面的子类工厂继承并产生一个具体的Product类实例。也就是说要生产某个类型的Product,必须通过Concrete的Factory的FactoryMethod()方法来生成。

 

举例说明

假设我们有个Document类,用来产生一个文档,文档的方法分别init(), show()和dump()。我们可以定义该类为abstract。

public  class Document {
     void init(){};

     void show(){};

     void dump(){};
}

生产Document的工厂类为Application,注意它引用了一个Document的类变量。在该工厂类中定义了几个抽像方法:createDocument()和cleanDump()。

public abstract class Application {
    protected Document doc;

    public abstract void createDocument();

    public abstract void cleanDump();

    public void createObjects() {
        //...
        createDocument();
    }
}

Document的两个子类

public class MyDocument extends Document {
    void init() {
        System.out.println("Init MyDocument");
    }

    void show() {
        System.out.println("Show MyDocument");
    }

    void dump() {
        System.out.println("Exit MyDocument");
    }
}

.

public class YourDocument extends Document {
    void init() {
        System.out.println("Init YourDocument");
    }

    void show() {
        System.out.println("Show YourDocument");
    }

    void dump() {
        System.out.println("Exit YourDocument");
    }
}

继承工厂Application的2个子类,分别实现了抽像方法。注意每个createDocument()实例化的分别是MyDocument和YourDocument类,这是关键所在。

public class MyApplication extends Application {
    public MyApplication() {
        //
    }

    public void createDocument() {
        doc = new MyDocument();
        doc.init();
        doc.show();
    }

    public void cleanDump() {
        doc.dump();
    }

}

.

public class YourApplication extends Application {
    public YourApplication() {
        //
    }

    public void createDocument() {
        doc = new YourDocument();
        doc.init();
        doc.show();
    }

    public void cleanDump() {
        doc.dump();
    }

}

以上是工厂方法的实现代码样例,从它的类结构图我们可以看出工厂-产品之间的实现方式。

运行代码如下:

public class Client {
    public static void main(String args[]) {
        Application app = new MyApplication();
        app.createObjects();
        app.cleanDump();

        app = new YourApplication();
        app.createObjects();
        app.cleanDump();
    }
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics