工厂模式是面向对象编程中最常使用的模式之一。它是一个创建者模式,使用一个类为其他的一个或者多个类创建对象。当我们要为这些类创建对象时,不需再使用new构造器,而使用工厂类。使用工厂类,可以将对象的创建集中化,这样做有以下折好处:
更容易修改类,或者改变创建对象的方式;
更容易为有限资源限制创建对象的数目。例如,我们可以限制一个类型的对象不多于n个;
更容易为创建的对象生成统计数据;
Java提供了ThreadFactory接口,Java并发API的高级工具类也使用了线程工厂创建线程。示例:
package concurrency;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.List;import java.util.concurrent.ThreadFactory;import java.util.concurrent.TimeUnit;public class main7 { public static void main(String[] args) { MyThreadFactory factory = new MyThreadFactory("MyThreadFactory "); Task2 task = new Task2(); Thread thread; System.out.printf("Starting the Threads\n"); for(int i=0; i<10; i++){ thread = factory.newThread(task); thread.start(); } System.out.printf("Factory stats:\n"); System.out.printf("%s\n", factory.getStats()); }}/*扩展ThreadFactory接口*/class MyThreadFactory implements ThreadFactory{ private int counter; private String name; private Liststats; public MyThreadFactory(String name) { this.counter = 0; this.name = name; stats = new ArrayList (); } /*扩展ThreadFactory就必须实现newThread()方法*/ @Override public Thread newThread(Runnable r) { Thread t = new Thread(r,name+"-Thread_"+counter); counter++; stats.add(String.format("Created thread %d with name %s on %s\n", t.getId(),t.getName(),new Date())); return t; } public String getStats(){ StringBuffer buffer = new StringBuffer(); Iterator it = stats.iterator(); while(it.hasNext()){ buffer.append(it.next()); buffer.append("\n"); } return buffer.toString(); }}class Task2 implements Runnable{ @Override public void run() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } }}
ThreadFactory接口只有一个方法,即newThread,它以Runnable接口对象作为传入参数并且返回一个线程对象。当实现ThreadFactory接口时,必须实现这个方法。大多数基本的线程工厂类只有一行,即:
return new Thread(r);
可以通过增加一些变化来强化实现方法覆盖。