ギャングオブフォー
最近PHPで製造を行っていてもよく耳にするようになった依存関係やインスタンス化など
オブジェクト指向の用語ですが、オブジェクト指向の概念(5原則など)を学ぶのではなく
手っ取り早く実際にオブジェクト指向を使って考えられたデザインパターンに触れてみましょう 。
デザインパターンと言ってもいろいろあるんですが、今回は【オブジェクト指向における再利用のためのデザインパターン(ソフトバンクパブリッシング刊】
で有名なGoFのデザインパターンを取り上げます。
GoFって何?って人はGoFでググってください。GoFに付いてはいたる所で説明されているので割愛します。
GoFのデザインパターンとはオブジェクト指向言語で再利用できる汎用的な設計パターンの事です。
ここで言う設計とはクラス設計の事を言います。クラス設計を行う場合毎回と言っていいほど役割や機能をどのクラスのどんなメソッドに持たせるか悩む事があるんじゃないでしょうか?
そんな時、ある程度形になったクラス設計のパターンの中から必要に応じて選択していけば効率的にクラス設計が行えるのではないでしょうか。このクラス設計のパターンがデザインパターン
と呼ばれている物です。
デザインパターンを選択する方法はいろいろあると思いますが、私がパターンを選択する場合以下の3点で判断します。
1.目的があっているか(どんなプログラムのための物なのか)
2.効果(そのパターンに従うとどんなメリットがあるか)
3.背景(自分が今どんな問題に直面しているか)
この3つのポイント、デザインパターンを理解する上でこのポイントと名前さえ覚えればパターンを理解出来ていると言っても言いぐらい重要な要素になります。
GoFのデザインパターンは23個あるので、今日を含めても23回はネタが切れないなんていいブログネタなんでしょう。なので毎回だらだらとデザインパターンに付いて書いても読みづらいと
思うので目的、効果、背景、実際のコードを書いていきたいと思います。おおこれ使えるかもってパターンがあったら実際にデザインパターンを考案したGoFが書いた【オブジェクト指向における再利用のためのデザインパターン(ソフトバンクパブリッシング刊】
を読んでみてください(Blogではこんなパターンがあるよを目的に書くのでかなり浅い内容になります)。
では手始めに一番簡単なSingletonパターンを紹介します。って一回目にSingletonパターンを持ってくるあたりがセンスないですが、
意外とGoFのデザインパターンって知らずに使っている人が多いようなのであえて今日はSingletonです。
目的
複数のクラスから共通して使われるクラスのオブジェクトを1回インスタンス化したらそれ以上インスタンス化したくない!
背景
普通のクラスではnewすればするほどインスタンスが出来ますが、たまに1回だけインスタンス化したら
それ以上インスタンス化をしたくない場合があります。コードを書くときに1回だけnewするようにすればいいじゃんって思えますが、マルチスレッドの場合
どのクラスがまたはどのクラスのインスタンスがnewするのかを制御しようと思った時に結構めんどくさくないですか?だって一番最初に呼ばれるインスタンスを特定しなくちゃいけないんですよ。。
効果
インスタンス化されているか、されてないかをsupplierは意識する必要がない。
※supplierとはは呼び出し元のクラスです。
実際のコードはとっても簡単
final class MyClass {
private static final MyClass instance = new MyClass();
private MyClass(){};
public static MyClass getInstance(){
return instance;
}
public void hogehoge(){
System.out.println("hogehogeメソッド");
}
}
class Test{
public static void main(String aa[]){
MyClass m = MyClass.getInstance();
m.hogehoge();
}
}
javaの場合定数の初期化は一度しか行われないのが保障されているので必ず一度しかインスタンス化はおこなわれないです。
しかしコンストラクターが呼び出せてしまうと、インスタンス化されてしまうので、MyClassのコンストラクターにprivate修飾を付けることによりアク禁にしてます。
php版 小川先生提供です。
<?php
class Singleton
{
private static $instance = null;
private function __construct() {}
public static function getInstance()
{
if (is_null(self::$instance)) {
$class = __CLASS__;
self::$instance = new $class;
}
return self::$instance;
}
}
$obj1 = Singleton::getInstance();
と言うわけで、Singletonでした。
終わり。