home > デザインパターン >

ForNext

Only Do What Only You Can Do

Abstract Factory

VBScript

JScript

Perl

PHP

Python

Ruby

PowerShell

Scala

F#

C

C++

C++Builder

VC++

C#

Java

更新日 : 2010.11.24
■ 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;
    }
}
■ 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();
    }
}
■ 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;
        }
    }
}
■ 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());
    }
}
L:\>java MyMain Suzuki
Suzuki
20
Tokyo
2

L:\>java MyMain Tanaka
Tanaka
30
Yokohama
3

Objective-C

D

VB

VB.NET

Delphi

Ada

PL/SQL

T-SQL

関数型

inserted by FC2 system