工厂模式是面向对象编程中最常使用的模式之一。它是一个创建者模式,使用一个类为其他的一个或者多个类创建对象。当我们要为这些类创建对象时,不需再使用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 List<String> stats;
public MyThreadFactory(String name) {
this.counter = 0;
this.name = name;
stats = new ArrayList<String>();
}
/*扩展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<String> 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);
可以通过增加一些变化来强化实现方法覆盖。