接口 - 注册类继承接口以基于类创建对象

时间:2015-12-10 21:27:26

标签: java interface abstract-class

如何“注册”一个实现接口的类来创建基于“已注册”类的对象?让我解释一下我想做的事情:

我为我的线程池服务器编写了一个请求处理器,我想在服务器上“配置”请求处理器,这样我就可以选择服务器应该使用哪个请求处理器来处理它的请求。以下是我认为应该有效的方法:

// 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我的接口/抽象类来编写自己的请求处理器,然后简单地“注册”他们自己的请求处理器?

我希望你们明白我的意思。对不起,如果这是一个重复,但我真的不知道这个技术术语:/

1 个答案:

答案 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);

获取RequestProcessorARequestProcessorB的内容,具体取决于传递的工厂。

相关问题