Abstract Factory パターン

Abstract Factory パターン

MyMain

public class MyMain {
    public static void main(String args[]) {
        // シンプルファクトリを 使用して、ファクトリオブジェクトを 作成
        MyFactory factory = MySimpleFactory.getFactory(args[0]);
        if (factory == null) return;

        // ファクトリメソッドを呼び出すのではなく、
        // ファクトリオブジェクトが作成したオブジェクトを、使用する
        MyClassA classA = factory.getMyClassA();
        MyClassB classB = factory.getMyClassB();

        // classA1 を使っているのか、classA2 を使っているのか、意識しない
        System.out.println(classA.getName());
        System.out.println(classA.getAge());

        // classB1 を使っているのか、classB2 を使っているのか、意識しない
        System.out.println(classB.getAddress());
        System.out.println(classB.getFloor());
    }
}

MySimpleFactory

public class MySimpleFactory {
    public static MyFactory getFactory(String owner) {
        if (owner.equals("Suzuki")) {
            return new MyFactory1();
        } else if (owner.equals("Tanaka")) {
            return new MyFactory2();
        } else {
            return null;
        }
    }
}

MyFactory

public abstract class MyFactory {
    protected MyClassA myClassA;
    protected MyClassB myClassB;

    public MyFactory() {
        myClassA = createMyClassA();
        myClassB = createMyClassB();
    }

    public MyClassA getMyClassA() {
        return myClassA;
    }
    public MyClassB getMyClassB() {
        return myClassB;
    }

    protected abstract MyClassA createMyClassA();
    protected abstract MyClassB createMyClassB();
}

MyFactory1

public class MyFactory1 extends MyFactory {
    protected MyClassA createMyClassA() {
        return new MyClassA1();
    }
    protected MyClassB createMyClassB() {
        return new MyClassB1();
    }
}

MyFactory2

public class MyFactory2 extends MyFactory {
    protected MyClassA createMyClassA() {
        return new MyClassA2();
    }
    protected MyClassB createMyClassB() {
        return new MyClassB2();
    }
}

MyClassA

public abstract class MyClassA {
    public abstract String getName();
    public abstract int getAge();
    // 不要
//  public abstract MyClassB createMyClassB();
}

MyClassA1

public class MyClassA1 extends MyClassA {
    public String getName() {
        return "Suzuki";
    }
    public int getAge() {
        return 20;
    }
    // 不要
//  public MyClassB createMyClassB() {
//      return new MyClassB1();
//  }
}

MyClassA2

public class MyClassA2 extends MyClassA {
    public String getName() {
        return "Tanaka";
    }
    public int getAge() {
        return 30;
    }
    // 不要
//  public MyClassB createMyClassB() {
//      return new MyClassB2();
//  }
}

MyClassB

// 変更なし
public abstract class MyClassB {
    public abstract String getAddress();
    public abstract int getFloor();
}

MyClassB1

// 変更なし
public class MyClassB1 extends MyClassB {
    public String getAddress() {
        return "Tokyo";
    }
    public int getFloor() {
        return 2;
    }
}

MyClassB2

// 変更なし
public class MyClassB2 extends MyClassB {
    public String getAddress() {
        return "Yokohama";
    }
    public int getFloor() {
        return 3;
    }
}

実行結果

L:\>java MyMain Suzuki
Suzuki
20
Tokyo
2

L:\>java MyMain Tanaka
Tanaka
30
Yokohama
3