デザインパターン[GoF 23]#4 FactoryMethodパターン

こんにちは!ぐちです。

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

そろそろ12月も折り返しですね〜。今日は関西方面もほんとに寒くて冬本番!という感じです。着々とスノーボードの準備が整い始めているぐちですが、ぼっちイベントはきっちり進めていきますよ〜。笑
ということでデザインパターンのご紹介を連チャンでいきます!今回は下記の記事四つ目をご紹介したいと思います。

FactoryMethodパターン

読んで字のごとく「Factory = 工場」の働きをします。何を作るのかといいますと、すばり!インスタンスです。あるクラスのメンバの中に、別のクラスのインスタンスを返すメソッドを定義します。なぜそのようなメソッドが必要か言いますと、対象のクラスと一緒に使う(or使ってほしい)必要があるからです。

例え話

PCメーカーとPCをイメージしてほしいのですが、例えば、MicrosoftクラスとAppleクラスがあります。そこから製造されているパソコンはMicrosoft = Windows、Apple = Macですよね。これらをペアで考えるならば、コードは下記のように検討されると思います。(強引な例えですいません。。。)

public class Microsoft {
     public Windows createWindows() {
          return new Windows();
     }
}

とか、

public class Apple {
     public Mac createMac() {
          return new Mac();
     }
}

ですかね。
ただし、それぞれメソッド名が異なると種類が増えたときに覚えられないので共通のcreatePCというメソッドに統一したいと思います。MacクラスでもWindowsクラスでも返せるようにする必要があるので、両クラスを汎化(親クラスを共通化)することで対応したいと思います。

コード

public class PC {
     
}

まずは親クラスになるPCクラスを定義します。続いて、Windows、Macの両クラスでPCクラスを継承しします。

public class Windows extends PC {

}

これは単純な汎化になるので、説明は不要ですよね。

public class Mac extends PC {

}

こちらも同様です。

次にMicrosoftクラスとAppleクラスで共通のcreatePCメソッドを定義する必要があるのですが、必ず子クラスで定義させるようにしたいので、親クラス(Makerクラス)の定義時にabstractを定義します。

public abstract class Maker {
     public abstract PC createPC();
}

まずはMicrosoft、Appleの共通クラスを定義します。※メーカーじゃないというツッコミはご愛嬌ということで。笑

public class Microsoft extends Maker {
     @Override
     public PC createPC() {
          return new Windows();
     }
}

継承し、それぞれのクラスのインスタンスを返却するようにオーバーライドします。

public class Apple extends Maker {
     @Override
     public PC createPC() {
          return new Mac();
     }
}

こちらも同様です。

使い方は下記の感じですかね〜。

public class Main {
     public static void main(String[] args) {
          Microsoft microsoft = new Microsoft();
          PC windows = microsoft.createPC();

          Apple apple = new Apple();
          PC mac = microsoft.createPC();
     }
}

これでどのメーカーでもPC生成の処理を持つ必要があり、それらオブジェクトは共通の型PCで扱うことができるようになりました。ただしクラス数が増えますので管理が煩雑になることもありますので採用時は本当に必要かどうかをしっかりと検討する必要があります。

サンプルコード

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

では今回はこの辺で。

2016年振り返り

秋に友人の結婚式に招待され初めて宮城県に行きました。結婚式自体は非常に良い雰囲気で無事に終わったのですが、帰りに気仙沼に行きました。東北大地震で災害をもろに受けた町を車で走ったのですが、自然の爪痕が残っているところもあったり、全く何もなかったように復興している場所もあったりして非常に考えさせられました。
結婚式のスピーチで「我々は非常に多くの悲しみの上を歩いて生きています。そんな中でもこうやって幸せな瞬間に立ち会えたことは新しい未来に向けて大きな前進をしていると確信しました。」というセリフがありました。本当に甚大な被害に遭われ悲しみを乗り越えて、町や人それぞれの思いを未来へ繋ごうと奮闘されているのだと身をもって感じることができました。
それぞれができることを精一杯やることの大切や力強さを感じ、自分の生き方を考え直すきっかけになりました。

ぼっちAdvent Calendar風ルール

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

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