AbstractFactoryが「ファクトリのファクトリ」であることを示唆するものは何もないと思います。は、sAbstractFactory<T>
を作成するファクトリを作成するのではなく、sを直接作成します。T
T
それが抽象的であるという考えは、ロジックを作成T
して注入できるようにすることです。したがって、たとえば、次のようになります。
public interface ConnectionFactory {
Connection newConnection();
}
//passed to your object normally:
public class RealConnectionFactory implements ConnectionFactory {
//...
}
//passed to your object when unit testing:
public class FakeConnectionFactory implements ConnectionFactory {
//...
}
//...
public class MyDao {
public MyDao(ConnectionFactory connectionFactory) {
this.conn = connectionFactory.newConnection();
}
}
この場合、はsConnectionFactory
を作成Connection
しますが、インターフェースであるため抽象的です。
抽象的ではなく、実際には拡張できないため、抽象ファクトリの標準的な例でClass<?>.newInstance()
はないことに同意する傾向があります。を要求して、1つの実装で新しい値をに初期化し、別の実装で新しい値をに初期化することはできません。Class
Class<Integer>
1
7
ただし、具体的な実装とを使用したsのClass<? extends InputStream>
抽象ファクトリのようなものを言うことで、物事を拡張することができます。ただし、これは「抽象」の従来の意味ではありません(まだ1つのクラスしかありません:) 。InputStream
Class<SocketInputStream>
Class<FileInputStream>
Class
ただし、「ファクトリ」の新しい具象バージョンを実装する方法は、を拡張する新しいクラスを作成することであるため、それでも抽象ファクトリとしては役に立ちませんInputStream
。これは、抽象ファクトリが意図していることではありません。