У меня проблема, потому что я не смог определить подходящий шаблон дизайна.
Я хочу создавать экземпляры в зависимости от заданного типа, который был передан фабричному методу. То, что я делаю до сих пор, следующее:
T create(SuperType x) {
if (x instanceof SubType1) {
// do some stuff and return a new SubType extends T
} else if (x instanceof SubType2) {
// do some stuff and return a new SubType extends T
} else if ...
} else {
throw new UnSupportedOperationException("nothing defined for " + x);
}
}
Кажется, это не лучшая оценка для меня.
У кого-нибудь есть идея, как решить это лучше?
EDIT: класс, который я получаю, не создан сам по себе, это экземпляр http://wala.sourceforge.net/javadocs/trunk/com/ibm/wala/ssa/SSAInstruction.html, который имеет несколько подклассов, для которых я Я создаю новые экземпляры в зависимости от передаваемого типа.
В объектно-ориентированном программировании включение типа обычно осуществляется с помощью полиморфизма, либо путем перемещения метода create в SuperType
(где он может быть переопределен для каждого Subtype
), либо через шаблон посетителя.
Изменение: если вы не можете изменить класс, полиморфизм отсутствует. Но, к счастью, класс, похоже, поддерживает шаблон посетителя (см. Метод visit()
), поэтому вы все равно можете его использовать.