デザインパターン[GoF 23]#6 Prototypeパターン

こんにちは!ぐちです。

〜ぼっちAdvent Calendar風イベント実施中[28日目]〜

僕が勤めている会社は今日が仕事納めです。夕方から大掃除と夜は納会なのでほとんど仕事はできないですね。というか最終日にがっつり仕事をする気にならないですよね。(←ダメ。ぜったい。)

はい、ではそんな仕事納めの日にご紹介するのは年内ラストの・・・・デザインパターン!!!です。笑
今回は下記の記事六つ目をご紹介したいと思います。

Prototypeパターン

生成するオブジェクトの原型(プロトタイプ)をコピーして新しいオブジェクトを作る手法です。クラスから新しいオブジェクトを生成するFactoryMethodパターンを以前ご紹介しましたが、こちらと並べて掲載されることが多いようですね。

Prototypeパターンは複製を生成するためのメソッドを用意するといういたってシンプルなデザインパターンです。複製ですので、状態(属性値など)は引き継ぎます。FactoryMethodパターンは新しくオブジェクトを生成するので状態は引き継ぎません。

下記にコードを紹介していきますね。

クローン可能なオブジェクトとするためにCloneableインターフェースを実装します。

public class Printer implements Cloneable {
     String str;

     public Printer(String str) {
          this.str = str;
     }

     public void printMessage() {
          System.out.println(this);
     }

     @Override
     public Printer clone() {
          Printer cloned = null;
          try {
               cloned = (Printer) super.clone();
          } catch (CloneNotSupportedException e) {
               e.printStackTrace();
          }
          return cloned;
     }
}

次にオブジェクトの複製を担うFactoryクラスを定義します。

public class Facotry {
     Map<String, Printer> protoMap;

     public Facotry() {
          protoMap = new HashMap<String, Printer>();
          protoMap.put("a", new Printer("a"));
          protoMap.put("b", new Printer("b"));
          protoMap.put("c", new Printer("c"));
     }

     public Printer create(String type) {
          return protoMap.get(type).clone();
     }
}

下記のように使います。マスタオブジェクトを用意しておいて、それらのコピーを生成して利用するようなイメージですね。

public class Main {

     public static void main(String[] args) {
          Facotry factory = new Facotry();
          Printer printer;

          printer = factory.create("a");
          printer.printMessage();
          printer = factory.create("b");
          printer.printMessage();
          printer = factory.create("c");
          printer.printMessage();
     }
}

これらの内容だけだと少しわかりにくいかもしれませんが、こんな感じのデザインパターンです。笑

サンプルコード

GitHubにアップしていますのでご自由にお使いください。

では今回はこの辺で。

2016年振り返り

僕が勤めている会社は、新卒採用の会社説明会にて、先輩社員との座談会というのを実施しているのですが、毎年人事部から召集がかかります。期待してもらっているのは非常に有難いのですが、年々話す学生さんたちとの年齢差が開いていくばかりで、毎回すごいエネルギーをもらっています。数グループに分かれて行うのですが、自分のグループになった学生さんが、採用面接のときに「覚えています。座談会で〜でしたよね」のように話してくれると非常に嬉しく、新入社員の受け入れにも力が入るなーと毎年感じています。

ぼっちAdvent Calendar風ルール

  • 1日1記事更新する
  • 記事内に1年間の出来事の振り返りを1つ明記する
  • 1日の期間は起きてから寝るまで(時刻ではない)

ぼっちAdvent Calendar風イベントとは?下記の記事をご覧ください。