Хорошо, я хочу начать свой вопрос с примера того, что я хотел бы сделать, хотя он не работает таким образом.Шаблон проектирования, необходимый для обеспечения статических методов
Я хочу иметь интерфейс IDog
, который применяет его реализации к некоторым методам. Я также хочу суперкласс AbstractDog implements IDog
, чтобы дать основные атрибуты и методы всем классам Dog
. Тогда я хочу иметь подклассы вроде Poodle extends AbstractDog
. Моя проблема здесь static
методов - я в основном хочу, чтобы каждый подкласс AbstractDog
имел другой метод static
, но я хочу, чтобы этот способ применялся с IDog
.
Так что моя наивная (и неправильно) реализация будет:
public interface IDog {
String getName(); // every dog instance should be able to call name
static String getDescription(); // every dog class should be able to get its description
}
public abstract class AbstractDog implements IDog {
private String name; // every dog instance will have this
public AbstractDog(String name) {
this.name = name;
}
@Override
public String getName() {
return this.name; // every dog instance can call this
}
}
public class Poodle extends AbstractDog {
private static String description = "It's a poodle!"; // all Poodles have the same description
public Poodle(String name) {
super(name);
}
@Override // from IDog
public static String getDescription() {
return description;
}
}
Теперь, как я уже сказал, это не правильно, потому что AbstractDog
классу будет нужен static abstract
метод getDescription()
и IDog
нуждается в реализации своего метода и его нельзя переопределить.
Я хочу знать, если есть шаблон проектирования, который соответствует моей проблеме: применение набора классов (которые могут или должны иметь промежуточный суперкласс) для реализации статического метода (другого!).
Одним из возможных вариантов я обнаружил, но я не уверен, что это может быть полезно или даже адекватной, было бы использование enum DogType
, а затем просто имея class Dog
с DogType
атрибута:
public enum DogType {
Poodle("This is a poodle."), Havanese("This is a Havanese.)";
private String description;
private DogType(String description) {
this.description = description;
}
public String getDescription() {
return this.description;
}
}
public class Dog {
private String name;
private DogType dogType;
public Dog(String name, DogType dogType) {
this.name = name;
this.dogType = dogType;
}
public String getName() {
return this.name;
}
public String getDescription {
return this.dogType.getDescription();
}
}
Однако этот «обходной путь» теряет способность по моей первоначальной идее: теперь я не могу добавлять дополнительные функциональные возможности только к одному классу собак, например, к методу экземпляра void prance()
, который должен быть доступен только для Poodle
.
Многие темы, относящиеся к подобным вопросам, относятся к шаблону Factory, но я не уверен, как он подходит для моей проблемы, потому что мне не обязательно нужен метод построения. И по мере того, как растет количество собак, мой код будет очень запутанным, я думаю. Или, может быть, я просто не понял, как Фабрика должна быть правильно использована в моем случае.
'public String getDescription() { возвращение« Это пудель! »; } '??? – fabian