1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

factoryとは

  • Kotlinにおけるインスタンス生成方法の1つ
  • インスタンスの生成で、singleまたはfactoryを使う
    参考サイト:

singlefactoryの使い分け

  • singlefactoryをどうやって使い分けるかはアプリの設計に関係してくる
    • 一般的なAndroidアプリでは、以下の観点で使い分けられるケースが多い(あくまで一例)
      • Repositoryクラスのように決まった対象のDBへアクセスする必要があり、かつ、アクセスする際に、一貫性を保つ必要があるケース
        single(Singleton)
      • HttpClientクラスのような決まった設定値を全てのアプリで使い回すケース
        single(Singleton)
      • UseCaseのような画面(ViewModel)で必要になる度に生成された方がメモリのコストなどでメリットになるケース
        factory

UseCaseが「メモリコスト」より、「生成コスト」の方がコストが低い理由

(UseCaseは、一度生成してから全てのアプリで使い回す「メモリコスト」よりも、必要になったらその都度生成する「生成コスト」の方がコストが低い)

  • 「一度生成してから全てのアプリで使い回す」のは、マルチスレッド環境だと、確実にインスタンスが1つになることを保証するためにロックを使う必要がある
    そのため、意外とコストが大きい
  • UseCAseは、ステートを持っていないため、インスタンスを作るコストが低い

という背景があるカモ

メモリコストが高くなる理由の補足

  • 「一度生成してから全てのアプリで使い回す」のは、マルチスレッド環境だと、確実にインスタンスが1つになることを保証するためにロックを使う必要がある

複数のスレッドで同時にインスタンスが使われてしまうのを防ぐには、ロック(DBが同時にデータを弄れないようにロックをするイメージ)をすることが必要
(DBのロックと意味合いは同じ)

スレッドを意識しなければ、

override fun get(context: InstanceContext):T{
    if(!isCrated(context)){
        value = creat(context)
    }

    return getValue()
}

でいいハズ・・・
しかし、実際のコードを見ると、synchronizedで囲んでややこしいことをしている
そして、最終的にはsynchronizedにたどり着く

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?