AbstructFactoryパターンのコード例です。
package org.example.abstruct.factory.factory;
public abstract class AbstructProduct1 {
public abstract void method1();
}
package org.example.abstruct.factory.factory;
public abstract class AbstructProduct2 {
public abstract void method2();
}
package org.example.abstruct.factory.factory;
public abstract class AbstructFactory {
public static AbstructFactory getFactory(String className)
{
AbstructFactory factory = null;
try {
factory = (AbstructFactory)Class.forName(className).getDeclaredConstructor().newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return factory;
}
public abstract AbstructProduct1 createAbstructProduct1();
public abstract AbstructProduct2 createAbstructProduct2();
}
package org.example.abstruct.factory.concrete;
import org.example.abstruct.factory.factory.AbstructProduct1;
public class concreteAbstructProduct1 extends AbstructProduct1 {
@Override
public void method1() {
}
}
package org.example.abstruct.factory.concrete;
import org.example.abstruct.factory.factory.AbstructProduct2;
public class concreteAbstructProduct2 extends AbstructProduct2 {
@Override
public void method2() {
}
}
package org.example.abstruct.factory.concrete;
import org.example.abstruct.factory.factory.AbstructFactory;
import org.example.abstruct.factory.factory.AbstructProduct1;
import org.example.abstruct.factory.factory.AbstructProduct2;
public class concreteAbstructFactory extends AbstructFactory {
@Override
public AbstructProduct1 createAbstructProduct1() {
return new concreteAbstructProduct1();
}
@Override
public AbstructProduct2 createAbstructProduct2() {
return new concreteAbstructProduct2();
}
}
Factoryパターンが1Productを作成していたのに対して、AbstructFactoryパターンは複数Productを作成できるようにしたパターンです。
factory作成時にクラス名の文字列からインスタンスを作る、と本に書いてありました。
このやり方はいろいろ応用できるかも。
ちなみに、(AbstructFactory)Class.forName(className).newInstance();と書くのは非推奨となっています。
問題点は、Productを追加した場合、すでに作成している全てのconcreteProductに実装が必要と言うことですね。