トップページ > コンテンツ > プログラミング効率化 > プログラムを作る上での考え方 > デザインパターン > AbstractFactory

■メリット
インスタンスの作成を工場が一手に引き受けることで、
オブジェクトの組み合わせをユーザ側は意識すること利用可能となる。

■実装例
/*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