如何“注册”一个实现接口的类来创建基于“已注册”类的对象?让我解释一下我想做的事情:
我为我的线程池服务器编写了一个请求处理器,我想在服务器上“配置”请求处理器,这样我就可以选择服务器应该使用哪个请求处理器来处理它的请求。以下是我认为应该有效的方法:
// yes I know the interface can't extend the abstract Thread class ...
// see in the Server class what I want to do with it
public interface RequestProcessor extends Thread {
public final Socker socket;
RequestProcessor(final Socket paramSocket) {
socket = paramSocket;
}
// abstract so each request processor implementing this interface
// has to handle the request in his specific way
abstract void run();
}
public class RequestProcessorA implements RequestProcessor {
RequestProcessorA(final Socket paramSocket) {
super(paramSocket);
}
@Override
public void run() {
// do something with the request
}
}
public class RequestProcessorB implements RequestProcessor {
RequestProcessorB(final Socket paramSocket) {
super(paramSocket);
}
@Override
public void run() {
// do something different with the request
}
}
因此将此作为接口(或作为能够扩展Thread类的抽象类)我想创建一个服务器并告诉他使用wheater RequestProcessorA或RequestProcessorB,如:
public class Server extends Thread {
private final RequestProcessor processor;
private final ServerSocker server;
Server(final int paramPort, final RequestProcessor paramProcessor) {
processor = paramProcessor;
server = new ServerSocket(paramPort);
}
@Override
public void run() {
while (true) {
Socket socket = server.accept();
// how can I create a new RequestProcessorA object if "processor" is type of RequestProcessorA???
// how can I create a new RequestProcessorB object if "processor" is type of RequestProcessorB???
// how can I create a new CustomProcessor object if "processor" is type of CustomProcessor???
RequestProcessor rp = ???;
// add rp to the thread pool
}
}
}
那么如何设计这样的要求呢?我不想让它成为一个可扩展的库,以便其他人可以简单地使用服务器,只需通过extendimg / implementation我的接口/抽象类来编写自己的请求处理器,然后简单地“注册”他们自己的请求处理器?
我希望你们明白我的意思。对不起,如果这是一个重复,但我真的不知道这个技术术语:/
答案 0 :(得分:2)
您需要使用Abstract Factory pattern。创建一个工厂界面,并为您可能想要生成的每个类创建一个实现:
public interface IRequestProcessorFactory {
RequestProcessor create(Socket paramSocket);
}
并像这样实现:
public class RequestProcessorAFactory implements IRequestProcessorFactory {
public RequestProcessor create(Socket paramSocket) {
return new RequestProcessorA(paramSocket);
}
}
并将其实例传递给Server
。然后,拨打
RequestProcessor rp = factory.create(socket);
获取RequestProcessorA
或RequestProcessorB
的内容,具体取决于传递的工厂。