■メリット
インスタンスの作成を工場が一手に引き受けることで、
オブジェクトの組み合わせをユーザ側は意識すること利用可能となる。
■実装例
/*User.java*/
public class User {
public static void main(String[] args) {
AbstractFactory abstractFactory = AbstractFactory.get_target_factory("ProductA"); //AbstractFactoryのstatic変数・static関数とConcreteFactoryAのメソッドを持つ
AbstractProduct abstractProduct = abstractFactory.factoryMethod1(); //AbstractProductのstatic変数・static関数とConcreteProductAのメソッドを持つ
abstractProduct.method(); //ConcreteProductAのメソッドを呼び出す
}
}
/*AbstractFactory.java*/
public abstract class AbstractFactory {
abstract AbstractProduct factoryMethod1();
//どういった時にどの工場を呼び出すかの分岐
// 本分岐は参照URL的にはUser.javaの方で模様。
static AbstractFactory get_target_factory(String product_name) {
switch(product_name) {
case "ProductA":
return new ConcreteFactoryA();
case "ProcuctB":
return new ConcreteFactoryB();
default :
throw new IllegalArgumentException("Invalid Product");
}
}
}
/*AbstractProduct.java*/
public abstract class AbstractProduct {
public abstract void method(); //商品ごとに振る舞いを変えて欲しい機能
}
/*ConcreteFactoryA.java(ConcreteFactoryB.javaもA=>Bなだけでほぼ同様)*/
public class ConcreteFactoryA extends AbstractFactory {
public AbstractProduct factoryMethod1(){
return new ConcreteProductA();
}
}
/*ConcreteProductA.java(ConcreteProductB.javaもA=>Bなだけでほぼ同様)*/
public class ConcreteProductA extends AbstractProduct {
public void method(){
System.out.println("productAの機能です");
}
}
最終更新:2021年07月07日 18:50