1. シングルトンとは何か?
オブジェクト指向プログラミングをしていると、クラスファイルからインスタンスを生成してメソッドを利用することが基本形です。
ここでご質問です。プロジェクト全体で見た時にクラスAのインスタンスは何個ありますか??
そのインスタンスがシングルトンで設計してあれば、答えはひとつです!
つまり、シングルトンとはインスタンスがひとつしか存在しないことを保証する設計方法のこと
です。
2. シングルトンの実装手順
以下のクラスをシングルトンに設計しなおします。
public class Members {
init() {}
private let members: [String: Int] = ["Suzuki": 21, "Takashima": 30]
public func showAge(name: String) {
print(members[name]!)
}
}
let members = Members()
members.showAge(name: "Suzuki")
21
1. finalを付与する
シングルトンは継承禁止です。継承されてしまっては、1クラス1インスタンスで設計しているのに、親戚ができてしまったら困ります。
final public class Members {
2. initをprivateにする
イニシャライザをprivate化することで、絶対にクラスの外部からアクセスできないようにします。
private init() {}
3. 外部からの唯一の入り口を設置
シングルトンにしたいクラスは継承もできない、イニシャライズもできない、ということで外部からの入り口を作ってあげる必要があります。public staticプロパティ
を使用します。
その変数名はshared
とするのが一般的です。
補足: static
はスレッドセーフな修飾子です。iOSアプリは基本マルチスレッドプログラミングで実装するので、同時に違う処理が動いていることが多いです。なので、このマルチスレッドで処理が動いた時に複数のスレッドからstatic変数にアクセスされたとしても、ひとつしか変数が存在できません。
public static let shared = Members()
4. まとめ
これまでのコードをまとめると以下のようになります。
public class Members {
private init() {}
private let members: [String: Int] = ["Suzuki": 21, "Takashima": 30]
public static let shared = Members()
public func showAge(name: String) {
print(members[name]!)
}
}
Members.shared.showAge(name: "Suzuki")
sharedを介してしか、アクセスできなくなりました!
そしてインスタンスはただひとつpublic static let shared = Members()
のみです!
さいごに
シングルトンとは名前の通りで、クラスのインスタンスがひとつ(シングル)しか存在しないことを保証する設計方法でした。名前の割に単純です!
コメント