factoryとは
- Kotlinにおけるインスタンス生成方法の1つ
- インスタンスの生成で、
single
またはfactory
を使う
参考サイト:
single
とfactory
の使い分け
-
single
とfactory
をどうやって使い分けるかはアプリの設計に関係してくる- 一般的なAndroidアプリでは、以下の観点で使い分けられるケースが多い(あくまで一例)
- Repositoryクラスのように決まった対象のDBへアクセスする必要があり、かつ、アクセスする際に、一貫性を保つ必要があるケース
→ single(Singleton) - HttpClientクラスのような決まった設定値を全てのアプリで使い回すケース
→ single(Singleton) - UseCaseのような画面(ViewModel)で必要になる度に生成された方がメモリのコストなどでメリットになるケース
→ factory
- Repositoryクラスのように決まった対象のDBへアクセスする必要があり、かつ、アクセスする際に、一貫性を保つ必要があるケース
- 一般的なAndroidアプリでは、以下の観点で使い分けられるケースが多い(あくまで一例)
UseCaseが「メモリコスト」より、「生成コスト」の方がコストが低い理由
(UseCaseは、一度生成してから全てのアプリで使い回す「メモリコスト」よりも、必要になったらその都度生成する「生成コスト」の方がコストが低い)
- 「一度生成してから全てのアプリで使い回す」のは、マルチスレッド環境だと、確実にインスタンスが1つになることを保証するためにロックを使う必要がある
そのため、意外とコストが大きい - UseCAseは、ステートを持っていないため、インスタンスを作るコストが低い
という背景があるカモ
メモリコストが高くなる理由の補足
- 「一度生成してから全てのアプリで使い回す」のは、マルチスレッド環境だと、確実にインスタンスが1つになることを保証するためにロックを使う必要がある
複数のスレッドで同時にインスタンスが使われてしまうのを防ぐには、ロック(DBが同時にデータを弄れないようにロックをするイメージ)をすることが必要
(DBのロックと意味合いは同じ)
スレッドを意識しなければ、
override fun get(context: InstanceContext):T{
if(!isCrated(context)){
value = creat(context)
}
return getValue()
}
でいいハズ・・・
しかし、実際のコードを見ると、synchronized
で囲んでややこしいことをしている
そして、最終的にはsynchronizedにたどり着く