工厂方法模式是什么java设计模式介绍使用方法步骤



工厂方法模式是什么java设计模式介绍使用方法步骤,工厂方法模式是什么?java设计模式介绍。Factory Method(也就是工厂方法)模式的主要目的是用在创建对象的接口上面,而且还可以控制对哪个对象进行实例化。在java工厂方法模式中,工厂方法用户不用知道该实例化什么类,其用意主是为所实例化的多个类定义公共接口,而服务提供者来确定将要实例化上述类中的哪一个类而不是由客户代码。

java工厂方法模式通常会出现在客户代码里面,特别是发生在客户代码不必要了解具体实例化哪一个类的情况下。使用工厂方法模式的典型范例是Collection框架中的迭代器。Iterator模式给了顺序访问集合中元素的一种方式,然而创建迭代器常常要使用Factory Method模式。Java 1.2引入了Collection接口,另外还包括iterator()方法,所有集合都应该实现这个方法,iterator()使得调用者不必了解需要实例化哪个类。

Java Collection框架中,抽象类AbstractList<E>含有以下方法:

[java] view plaincopy

  1. public Interator<E> iterator() {
  2.     return new Itr();
  3. }

其中,Itr定义为AbstractList<E>的一个内部私有类,代码示例如下:

[java] view plaincopy

  1. private class Itr implements Iterator<E> {
  2.     /**
  3.      * Index of element to be returned by subsequent call to next.
  4.      */
  5.     int cursor = 0;
  6.     ……
  7. }

iterator()方法创建的对象顺序包括了集合中的各个元素,迭代器的具体使用方法能够参考以下代码:

[java] view plaincopy

  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.List;
  4. public class FactoryMethodIterator {
  5.     /**
  6.      * @param args
  7.      */
  8.     public static void main(String[] args) {
  9.         List<String> list = new ArrayList<String>();
  10.         list.add(“string one”);
  11.         list.add(“string two”);
  12.         list.add(“string three”);
  13.         Iterator<String> iterator = list.iterator();
  14.         while(iterator.hasNext()) {
  15.             System.out.print(iterator.next() + ” ”);
  16.         }
  17.     }
  18. }
  19. //其输出结果为
  20. string one string two string three

在常见的Spring Web架构中,org.springframework.beans.factory.BeanFactory接口提供Object getBean(String name)及其重载方法,能够将其看作Factory Method模式的一个典型应用。

Factory Method工厂方法模式的简单实例步骤代码如下:

(1)定义多个类的公共接口Store

[java] view plaincopy

  1. package codolio.test;
  2. public interface Store {
  3.     void store(String msg);
  4. }

(2)实现具体的工厂方法

[java] view plaincopy


  1. package codolio.test;
  2. public class StoreFactory {
  3.     public Store getStore(String location) {
  4.         Store store = null;
  5.         if (location.equalsIgnoreCase(“file”)) {
  6.             store = new FileStore();
  7.         }
  8.         else if (location.equalsIgnoreCase(“database”)) {
  9.             store = new DatabaseStore();
  10.         }
  11.         return store;
  12.     }
  13.     private class FileStore implements Store {
  14.         public void store(String msg) {
  15.             //store the data in the file
  16.             System.out.println(“The message ” + msg + ” has been stored – [File]“);
  17.         }
  18.     }
  19.     private class DatabaseStore implements Store {
  20.         public void store(String msg) {
  21.             //store the data in the database
  22.             System.out.println(“The message ” + msg + ” has been stored – [database]“);
  23.         }
  24.     }
  25. }

(3)测试类及输出结果

[java] view plaincopy

  1. package codolio.test;
  2. /**
  3.  * @author codolio
  4.  *
  5.  */
  6. public class FactoryMethodTest {
  7.     /**
  8.      * @param args
  9.      */
  10.     public static void main(String[] args) {
  11.         StoreFactory storeFactory = new StoreFactory();
  12.         Store store = storeFactory.getStore(“file”);
  13.         store.store(“This is my message”);
  14.         store = storeFactory.getStore(“database”);
  15.         store.store(“This is my message”);
  16.     }
  17. }
  18. //输出结果
  19. The message This is my message has been stored – [File]
  20. The message This is my message has been stored – [database]

在上述示例中,FileStore和DatabaseStore并不是一定要实现为StoreFactory的内部私有类。而且,在工厂方法模式里面,对公共接口的要求并非如此严格。就如,在Spring架构中,通过Spring IoC容器返回的Java对象间彼此关系通常都显得很松散,而且没有实现共同的接口。