home > デザインパターン >

ForNext

Only Do What Only You Can Do

Factory Method

VBScript

JScript

Perl

PHP

Python

Ruby

PowerShell

Scala

F#

C

C++

C++Builder

VC++

C#

Java

更新日 : 2010.11.24

■ Step 1

■ MyClassA1
public class MyClassA1 {
    public String getName() {
        return "Suzuki";
    }
    public int getAge() {
        return 20;
    }
}
■ MyClassB1
public class MyClassB1 {
    public String getAddress() {
        return "Tokyo";
    }
    public int getFloor() {
        return 2;
    }
}
■ MyMain
public class MyMain {
    public static void main(String args[]) {
        MyClassA1 classA = new MyClassA1();
        System.out.println(classA.getName());
        System.out.println(classA.getAge());

        MyClassB1 classB = new MyClassB1();
        System.out.println(classB.getAddress());
        System.out.println(classB.getFloor());
    }
}
L:\>java MyMain
Suzuki
20
Tokyo
2

■ Step 2

■ MyClassA (追加)
public abstract class MyClassA {
    public abstract String getName();
    public abstract int getAge();
}
■ MyClassA1 (MyClassA から 継承するよう 変更)
public class MyClassA1 extends MyClassA {
    public String getName() {
        return "Suzuki";
    }
    public int getAge() {
        return 20;
    }
}
■ MyClassA2 (追加)
public class MyClassA2 extends MyClassA {
    public String getName() {
        return "Tanaka";
    }
    public int getAge() {
        return 30;
    }
}
■ MyClassB (追加)
public abstract class MyClassB {
    public abstract String getAddress();
    public abstract int getFloor();
}
■ MyClassB1 (MyClassB から 継承するよう 変更)
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;
    }
}
■ MyMain
public class MyMain {
    public static void main(String args[]) {
        MyClassA classA = new MyClassA1();
        System.out.println(classA.getName());
        System.out.println(classA.getAge());

        MyClassB classB = new MyClassB1();
        System.out.println(classB.getAddress());
        System.out.println(classB.getFloor());

        classA = new MyClassA2();
        System.out.println(classA.getName());
        System.out.println(classA.getAge());

        classB = new MyClassB2();
        System.out.println(classB.getAddress());
        System.out.println(classB.getFloor());
    }
}
L:\>java MyMain
Suzuki
20
Tokyo
2
Tanaka
30
Yokohama
3

■ Step 3 Factory Method

■ 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();
    }
}
■ MyMain
public class MyMain {
    public static void main(String args[]) {
        MyClassA classA = new MyClassA1();
        System.out.println(classA.getName());
        System.out.println(classA.getAge());

        // ファクトリメソッド を 使用
        MyClassB classB = classA.createMyClassB();
        // classB1 を使っているのか、classB2 を使っているのか、意識しない
        System.out.println(classB.getAddress());
        System.out.println(classB.getFloor());

        classA = new MyClassA2();
        System.out.println(classA.getName());
        System.out.println(classA.getAge());

        // ファクトリメソッド を 使用
        classB = classA.createMyClassB();
        // classB1 を使っているのか、classB2 を使っているのか、意識しない
        System.out.println(classB.getAddress());
        System.out.println(classB.getFloor());
    }
}
L:\>java MyMain
Suzuki
20
Tokyo
2
Tanaka
30
Yokohama
3

Objective-C

D

VB

VB.NET

Delphi

Ada

PL/SQL

T-SQL

関数型

inserted by FC2 system