2010年11月25日木曜日

デザインパターン

デザインパターンはとは、書籍「オブジェクト指向における再利用のためのデザインパターン」において、所謂GoFと呼ばれる先人たちが、ソフトウェアに導入にしたオブジェクト指向におけるプログラム設計のパターンです。
これらのデザインパターンを使用してクラス設計することで、開発チーム内の用語統一化が進み、意思統一が図りやすくなります。
GoFのデザインパターンでは、23のデザインパターンが用意されています。

生成に関するパターン
  • Singletonパターン
  • FactoryMethodパターン
  • AbstractFactoryパターン
  • Builderパターン
  • Prototype パターン
構造に関するパターン
  • Adapterパターン
  • Bridgeパターン
  • Compositeパターン
  • Decoratorパターン
  • Facadeパターン
  • Flyweightパターン
  • Proxyパターン
振る舞いに関するパターン
  • ChainOfResponsibilityパターン
  • Commandパターン
  • Interpreterパターン
  • Iteratorパターン
  • Mediatorパターン
  • Mementoパターン
  • Observerパターン
  • Stateパターン
  • Strategyパターン
  • TemplateMethod パターン
  • Visitorパターン

Singletonパターン

Singletonパターン(シングルトン)を使用する場合、そのクラスのインスタンスが1つしか生成されないことを保証することができます。
Singletonパターンでは、様々なクラスから呼び出しが可能となります。
ただし、ステートフルに実装してしまうと、グローバル変数のように、プログラムの依存性が煩雑化し、構造が悪化するケースがあります。
安易にシングルトン化することは、非常に危険な行為ですので、十分に考慮する必要があります。



実装例
  • コンストラクタはprivateで定義する。
  • staticで、かつprivateで自分のインスタンスをもつ。
  • staticメソッドでgetInstance()メソッドを定義する。




public class MySingleton {
private static final MySingleton singleton = new MySingleton();
private MySingleton(){}
public static MySingleton getInstance(){
return singleton;
}
}




誤った実装例

以前、以下のような中途半端なSingletonを見たことがあります。



public class MySingleton {
private static MySingleton singleton;
private MySingleton(){}
public static MySingleton getInstance(){
if(singleton == null){
singleton = new MySingleton();
}
return singleton;
}
}


上記の実装を行った場合、getInstance()が非同期呼び出しに対応できていません。
そのため、getInstance()をsynchronizedする必要が出てきます。もし、synchronizedした場合、呼び出し単位で同期をとるため、性能への影響が発生します。

2010年11月22日月曜日

ハーバード白熱教室

マイケル・サンデルさんの東京大学での講義がNHKでやってるのを見ました。
以前も海外バージョンで放送されているのを見た覚えがありましたが、今回の講義は、日本を取り巻く具体的問題を取り上げているため、非常に面白い。

「正義」を以下の3つの考えを元に議論を進めていた。
  • イギリス功利主義哲学者ベンサムの「最大多数の最大幸福」
  • ドイツ哲学者カントの「人間の尊厳に価値をおく」
  • 古代ギリシャ哲学者アリストテレスの「美徳と共通善をたたえ育むこと」
3人の船員と1人の給仕「リチャード・パーカー」が救命ボートに乗り、気分が悪くなった若い給仕を殺して、その肉を食べて生き延びたという事例から、議論を行い、道徳観を浮かび上がらせている。
そして原爆と謝罪。コミュニティに対する考え。非常に楽しくテレビを見れたわけです。