クラス階層が存在し、最上位の基本クラスが抽象クラスであるいくつかの場所では、抽象クラスに静的な getInstance() メソッドがあります。これは、正しいサブクラスを作成し、それを呼び出し元に返す責任があります。たとえば、以下のコードを考えてみましょう。
public class abstract Product {
public static Product getInstance(String aCode) {
if ("a".equals(aCode) {
return new ProductA();
}
return ProductDefault();
}
// product behaviour methods
}
public class ProductA extends Product {}
public class ProductDefault extends Product {}
Java では、java.util.Calendar.getInstance() がこのパターンに従っている場所の 1 つです。ただし、これは、新しいサブクラスが導入されるたびに、基本クラスを変更する必要があることを意味します。つまり、上記の例では製品クラスを変更する必要があります。これはocpの原則に違反しているようです。また、基本クラスは、やはり疑わしいサブクラスの詳細を認識しています。
私の質問は...
- 上記のパターンはアンチパターンですか?
- 上記のパターンを使用することの欠点は何ですか?
- 代わりにどのような代替案に従うことができますか?