【初心者向け】Javaのデザインパターンを基礎から解説!



【初心者向け】Javaのデザインパターンを基礎から解説!

Java学習の最終段階で登場する「デザインパターン」。
本を読んでもWebで検索しても、Java初心者にとってはなかなかイメージしずらいですよね。
今回は、まったくのデザインパターン初心者でもイメージできるように情報をまとめてみました。

image

目次
  1. 【初心者向け】Javaのデザインパターンを基礎から解説!
  2. Javaのデザインパターンとは?
  3. Javaのデザインパターンを理解するメリット・使うメリット
  4. Javaのデザインパターンの種類
  5. デザインパターンを試す
  6. まとめ

【初心者向け】Javaのデザインパターンを基礎から解説!

Javaのデザインパターンとは?

image

画像出典:Amazon.co.jp

まず「デザインパターン」という言葉は、Javaに限らずPHPやPython、Rubyなどの開発現場でも使われています。 「デザインパターン」の意味としては、ある程度決まった処理をパッケージ化して、だれでも使えるようにまとめられた指示書です。

例えば、ネットショップの決済額に応じて表示する支払方法を変えたい時やゲームの対戦相手の強さを選択したい時、データベースの開発は専門スタッフに任せたい時など、「こんなことをしたい」や「こんなことに困っている」という時に役立つ仕組みです。 既存のJavaプログラムを読むときやこれからエンジニア・デビューしようとしている方、就職・転職を控えている方は知っておきたい知識ですね。

「デザイン」という抽象的な言葉を使っていますが、利用できる開発範囲はある程度決まっていますので以下に代表的なデザインパターンの使用範囲をご紹介します。


  • 【生成に関するパターン(Creational design patterns)】
    アプリを移植するときなど
  • 【構造に関するパターン(Structural design patterns)】
    アプリに「枠線」や「スクロールバー」などのアイテムを追加・管理したい時
  • 【振る舞いに関するパターン(Behavioral design patterns)】
    オブジェクトの変更を通知したい時や特殊言語の定義を統一したい時

GoF 23のパターンより



  • プレゼンテーション層のパターン(Presentation Tier)
    コードの複製や重複をスッキリしたい時
  • ビジネス層のパターン(Business Tier)
    処理速度の改善やネットワーク問題の解決に
  • インテグレーション層のパターン(Integration Tier)
    データベースの設計や管理の問題解決に

J2EE Patternsより


このほかにも NTT DATA が独自開発した「モバイルデザインパターン」や「インフラデザインパターン」など既存のデザインパターンに変更を加えて、進化している特徴もあります。またGitHubで公開されているJavaのデザインパターンは、100種類以上ありますね*

それにしてもJava初心者からすると、「デザインパターン」はずいぶん開発要素の細かいところの話でちょっとイメージにしにくいと思います。

デザインパターンの理解については、今まで同様、コードを書いたり読んでみることが一番でしょう。 本稿の第4章「デザインパターンを試す」に簡単なデザインパターンと複数のデザインパターンを組み合わせた例をご紹介しています。 まずはコードをコピペしてデザインパターンで作られたプログラムを体感し、次はコードを読んで、そして最後には自分なりのアレンジを加えて「デザインパターン」の理解を深めてみて下さい。

Javaのデザインパターンを理解するメリット・使うメリット

image

「デザインパターン」ちょっと難しそうで、やる気がおきない方もいらっしゃるかもしれません。 以下に「デザインパターン」を理解するメリット、使うメリットをご紹介させて頂きます。

【デザインパターンを理解するメリット】

  • ワンランク上の年収が狙える
  • Java学習の理解度チェックに役立つ
  • より具体的に開発現場をイメージできるようになり、就職・転職活動時の自信になる
  • Javaフレームワーク(Springなど)の理解に役立つ
  • 自分でもアプリ開発できそうな気がしてくる

Javaのデザインパターンを理解・習得する一番のメリットは、やはり「高年収」ではないでしょうか。就職・転職仲介サイトindeedで「java gof」で検索すると「月給80万円」や「年収700-1000万円」など一般的なエンジニアよりも高い報酬が提示されています。

高年収を視野にエンジニアもしくはプログラマ・デビューしようとしている方にとっては、「デザインパターン」見逃せないですよね。

【デザインパターンを使うメリット】

  • 開発スピードが上がる
  • バグのリスクを低減できる
  • 大規模・大人数による開発のスマート化
  • 開発者間のコミュニケーション向上に

Javaの「デザインパターン」が開発されたそもそもの理由は、開発者間の生産性のを埋めるためです(Wikiより)。 先輩エンジニアが苦労してまとめた最善の解決策(パターン)を、初心者でも少ない労力で簡単に使えるメリットがあります。またデザインパターンには、逆引き辞書的にプログラムの「問題点」「困っている点」からソリューションを見いだせるというメリットもあるでしょう。 その結果、デザインパターンは20年以上たった今も開発現場で使われているんですね。

Javaのデザインパターンの種類

image

Javaのデザインパターンを学習し始める時に、まずデザインパターンの全体像を把握しておくと、自分のやりたいことと照らし合わせられて効率がいいと思います。

【Javaのデザインパターンの種類】
大分類

  • GoF
  • J2EEパターン
  • アンチパターン

Javaのデザインパターンの中で一番有名でよく使われるものは、GoFゴフでしょう。 GoFは、デザインパターンの代名詞ともいわれ23種類のパターンがGoFに属します。GoFは、ロボットのソフト開発やゲーム開発、アプリ開発、医療用画像解析ソフトなど様々な分野の開発で使われていますね。このパターンは1994年にリリースされた書籍*で定義付けされています。

J2EEパターンは、JavaEEの前身J2EE時代に登場したデザインパターンで、主にアプリ開発を手伝ってくれます。データベース管理に役立つ「DAO」が有名ですね。 (公式サイト

アンチパターンは、「やってはいけないこと」を集めた事例集です。どうしても学習初期は、既存コードをあれこれイジって、結果動けばOK、となりますよね。 しかし、その編集には拡張性を欠くコードが記されていたり、保守性を下げるコードが記されているかもしれません。そんな自分では分からない「やってはいけないこと」をアンチパターンから学ぶことができます。このパターンもGoF同様書籍*にて紹介されていますね。(参考:Qiita - @y_ujitoko

デザインパターンを試す

image

それでは実際にJavaのデザインパターンを使って、理解を深めてみましょう。

【体験】ファクトリーパターン(GoFの生成に関するパターン)
ファクトリーパターンは、Javaフレームワークの Spring などにも使われているパターンです。 フレームワークは、一連のアプリケーションのアーキテクチャモデルを標準化する必要がありますが、ファクトリーパターンの利用で個々のアプリケーションが独自のドメインオブジェクトを定義してインスタンス化することが可能に。

実際に使ってみると分かるのですが、オブジェクトの生成が楽です。今回は、『JournalDev』のサンプルを参考にコンピュータのスペック出力をファクトリーパターンで実行してみます。 オブジェクトの元となるスーパークラスを Computer.javaにして、生成されるオブジェクト(サブクラス)を PC.java、Server.java、Mobile.java、それからそれらを実装するファクトリークラスを作成し、テストクラスで実行、という流れです。

>> 結果 image

参照:JournalDev

上記事例は1つのプロジェクトに1つのパターンですが、実際の開発現場では1つのプロジェクトに複数のパターンが使われることもよくあります。 こちらのテトリスゲームでは、シングルトン、ファクトリー、テンプレート、ストラテジ、ビジタパターンが使われています。 時間のある時にじっくりコードを読みたいですね。

Tetris Developed Java

まとめ

Javaを学習してきたならご存知と思いますが、学習を積み重ねる毎にプログラミングが楽しくなってきたと思います。 今回ご紹介したデザインパターンを理解すると、今まで以上にプログラミングが楽しくなり、いろいろ試してみたくなること間違いないでしょう。 一方でデザインパターンの理解には、Javaの基礎が欠かせません。 パッケージや抽象化、インタフェース、自力ではムリっ!という方、オンラインスクールのCodeCampに聞いてみませんか?

就職や転職を念頭においたJava学習ならお得に受講できますよ。

image

オシママサラ
この記事を書いた人
オシママサラ
\無料体験開催中!/自分のペースで確実に習得!
オンライン・プログラミングレッスンNo.1のCodeCamp