ギャングオブフォー
最近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とはは呼び出し元のクラスです。
実際のコードはとっても簡単
しかしコンストラクターが呼び出せてしまうと、インスタンス化されてしまうので、MyClassのコンストラクターにprivate修飾を付けることによりアク禁にしてます。
php版 小川先生提供です。
と言うわけで、Singletonでした。
終わり。
オブジェクト指向の用語ですが、オブジェクト指向の概念(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(); } - }
しかしコンストラクターが呼び出せてしまうと、インスタンス化されてしまうので、MyClassのコンストラクターにprivate修飾を付けることによりアク禁にしてます。
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でした。
終わり。
コメント
コメントフォーム
トラックバック
最近の記事
- もうすぐ健康診断があるんだ・・・ [2010年09月02日 : 阿部恵]
- Photoshopで壁紙を作りながら、基本的な使い方を覚える [2010年09月01日 : 鴨田健次]
- はじめての共同作業 Canvas編 (node.js + websocket) [2010年09月01日 : 中川善樹]
- 「PHP×Flex(後編)」PHPテクニカルセミナー(無料)第4弾の募集を開始しました!! [2010年08月26日 : 和田記光]
- 【HTML5】Canvasでお絵かきしてみた(前編) [2010年08月25日 : 橋本章史]
- MacにgroongaのMySQL用ストレージエンジン [2010年08月23日 : 笹亀弘]
- Appleのサイトで見たiPhone4をFireworksで描いてみました-1/2 [2010年08月19日 : 和田記光]
- iPad版の会社紹介を作ってみました [2010年08月19日 : 小林有佳]
- iPhoneアプリ開発開始時に気をつけるべきファイルの取り扱い (2) [2010年08月19日 : 亀本大地]
- symfonyセミナー動画無料公開! [2010年08月13日 : 岡本雄樹]



self::$instance = new self;
__CLASS__を使用した理由ですが、単純にnew selfという書き方が出来ることを知りませんでした。
ご指摘ありがとうございました。
コメントありがとう御座います。
self::$instance = new self;
と言う書き方ですが、私は書くべきでは無いと思いました。なぜなら左辺でインスタンスを参照しているselfが、右辺ではクラスを参照した書き方になっているからです。
可読性が落ちるのでは?と思いました。
少なくとも私は上記の書き方で動く事自体驚きです。
PHPはまだまだ初心者でいろいろな書き方が出来るPHPには日々驚かされます。
また、ご指摘があればどんどん書き込みお願いします。