Prototype パターン

Prototype パターン

MyMain

public class MyMain {
    public static void main(String args[]) {
        MyBuilder builder = new MyBuilder();

        // "年月日"形式の日付
        MyDirectorA dirA = new MyDirectorA();
        MyClass ymd      = dirA.createMyClass(builder);

        // "月日年"形式の日付
        MyDirectorB dirB = new MyDirectorB();
        MyClass mdy      = dirB.createMyClass(builder);

        MyClass dates[] = new MyClass[5];

        try {
            for (int i = 0; i < 5; i++) {
                // 都度 new せずに、作成済みのプロトタイプをコピーする
                if ((i % 2) == 0) {
                    dates[i] = (MyClass)ymd.clone();
                } else {
                    dates[i] = (MyClass)mdy.clone();
                }
            }
        } catch (CloneNotSupportedException ex) {
            System.out.println(ex);
        }

        for (int i = 0; i < 5; i++) {
            System.out.println(dates[i].getDateOfBirth());
        }
    }
}

MyClass

public class MyClass implements Cloneable {
    private String dateOfBirth;

    public MyClass(String dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    public String getDateOfBirth() {
        return dateOfBirth;
    }

    // 追加
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

MyBuilder

public class MyBuilder {
    private String dateOfBirth;

    public MyBuilder() {
        dateOfBirth = "";
    }

    public void addYear() {
        dateOfBirth += "yyyy";
    }
    public void addMonth() {
        dateOfBirth += "mm";
    }
    public void addDay() {
        dateOfBirth += "dd";
    }
    public void addDelimiter() {
        dateOfBirth += "/";
    }

    public MyClass getMyClass() {
        MyClass result = new MyClass(dateOfBirth);
        dateOfBirth = "";
        return result;
    }
}

MyDirectorA

public class MyDirectorA {
    public MyClass createMyClass(MyBuilder builder) {
        builder.addYear();
        builder.addDelimiter();
        builder.addMonth();
        builder.addDelimiter();
        builder.addDay();

        return builder.getMyClass();
    }
}

MyDirectorB

public class MyDirectorB {
    public MyClass createMyClass(MyBuilder builder) {
        builder.addMonth();
        builder.addDelimiter();
        builder.addDay();
        builder.addDelimiter();
        builder.addYear();

        return builder.getMyClass();
    }
}

実行結果

L:\>java MyMain
yyyy/mm/dd
mm/dd/yyyy
yyyy/mm/dd
mm/dd/yyyy
yyyy/mm/dd