Как уже говорил Майкл, ваша специальная реализация COR ( Цепочка ответственности ).
Если вашим требованием является просто асинхронный многопоточный код , то COR не является подходящим шаблоном для использования. Вместо этого используйте Customized Singleton с возможностью предоставления следующего доступного экземпляра из пула 'n' экземпляров.
Если вам требуется обрабатывать несколько типов запросов, причем некоторые типы запросов обрабатываются асинхронно, тогда используйтеCOR поможет.
Если мы видим структуру шаблона COR, он содержит цепочку, образованную ссылками типа Обработчик с методом handleRequest () . Каждый конкретный обработчик специализируется на обработке одного типа запроса , реализуя handleRequest (), что-то вроде следующего
if (canHandle){
handleIt();
} else if (hasNextHandler()){
passItToNextHandler();
} else {
// complete chain is unable to handle it. So leave it may be log it
}
Теперь, когда у вас есть два (или более) экземпляра обработчика одного и того же типа Concrete вцепочка, это похоже на хак за нарушение (хотя это будет работать).
Я бы предпочел поддерживать чистоту COR, связывая один экземпляр каждого типа конкретного обработчика в цепочке. Обработчик, в котором вам нужно асинхронно использовать несколько экземпляров, делегирует эту многопоточную задачу объектному пулу из handleRequest (). Может быть настроенным синглтоном, который обрабатывает «n» экземпляров вместо одного.
Это разделит две проблемы, а именно COR и Object pooling. Оба могут поддерживаться независимо друг от друга без необходимости какого-либо взлома.