Scalaでデザインパターンを実装してみようと思う。
・GoF本(オブジェクト指向における再利用のためのデザインパターン ソフトバンククリエイティブ刊)
・Wikipedia
・Scala Wiki
辺りを参考に。
できるだけC++, Javaと比べてScalaっぽいことができるといいなあ。
GoFの23パターン全部終わらせられるのやらどうやら…
とりあえずまずはSingletonパターン。
クラスのインスタンスが1つしかできないようにする。
Scalaでの実装は簡単。Objectを使うだけ。
言語レベルでサポートされていると楽っすね。
object Singleton {
val name = "Singleton"
}object Main {
def main(args: Array[String]) {
val singletonA = Singleton
val singletonB = Singleton
println(singletonA eq singletonB) // true
}
}
あっけなすぎたので上記のソースから生成されるバイトコードを逆コンパイルしてみる
//Singleton.class
import scala.reflect.ScalaSignature;@ScalaSignature(bytes="\006\001\025:Q!\001\002\t\006\035\t\021bU5oO2,Go\0348\013\005\r!\021!C:j]\036dW\r^8o\025\005)\021!\0043fg&<g\016]1ui\026\024hn\001\001\021\005!IQ\"\001\002\007\021)\021A\021!A\t\006-\021\021bU5oO2,Go\0348\024\007%aA\003\005\002\016%5\taB\003\002\020!\005!A.\0318h\025\005\t\022\001\0026bm\006L!a\005\b\003\r=\023'.Z2u!\t)\002$D\001\027\025\0059\022!B:dC2\f\027BA\r\027\005-\0316-\0317b\037\nTWm\031;\t\013mIA\021\001\017\002\rqJg.\033;?)\0059\001b\002\020\n\005\004%\taH\001\005]\006lW-F\001!!\ti\021%\003\002#\035\t11\013\036:j]\036Da\001J\005!\002\023\001\023!\0028b[\026\004\003")
public final class Singleton {
public static final String name() {
return Singleton..MODULE$.name();
}
}
//Singleton$.class
import scala.ScalaObject;public final class Singleton$
implements ScalaObject {
public static final MODULE$;
private final String name;static { new (); }
public String name() {
return this.name;
}private Singleton$() {
MODULE$ = this;
this.name = "Singleton";
}
}