2017-08-26 3 views
0

ソフトウェアアーキテクチャーとして長年働いていますが、私はシングルトンを避けることができます。しかし、アンドロイドのアプリケーションのためにいくつかの作業をする必要がある場合は、シングルトンが唯一の代替手段であると思われる場合に遭遇する。誰かが何か他のことを提案できるかもしれませんか?アンドロイドのシングルトンに代わって

タスクは、新しいエンティティ(私の場合は旅行の説明)を作成するためのUIウィザードを作成することです。エンティティは複雑で、すべてのデータを満たすには数ページが必要です。

ウィザードは、ユーザーが次のページに移動したときに1つ1つ後ろにスタックするためにプッシュされた複数のフラグメントとして編成されます。しかし、すべてのフラグメントは、編集エンティティの1つのインスタンスで動作するはずです。また、このエンティティは、アクティビティが再作成されたとき(回転後やその他の場合)に生き続ける必要があります。ページが1つだけだった場合、私はonSaveInstanceStateのエンティティを保存/復元することができます。しかし私が私のウィザードのすべてのフラグメントでそうするならば、すべてのフラグメントはエンティティの独自のインスタンスを保持するでしょう(それらのすべてがそれを保存してから復元するためです)。また、ウィザードは間違った動作をします(たとえば、前のページに戻るときなど)。

この断片を保持するアクティビティでこの特定のウィザードについて何も知ってはいけないとします。このウィザードに固有のコードをアクティビティに追加しません。私の場合、アクティビティを無効にすることもできません。

このような状況では、私の編集エンティティを保持するシングルトンを作成することが明らかです。そして、すべてのウィザードフラグメントがこのシングルトンで動作するようにしました。私のプログラマーの90%は疑う余地なくそのようなソリューションを選ぶでしょう。しかし、私の脳はそれに抗議する。その性質によってシングルトンではないとき、なぜ私はエンティティシングルトンを作るべきですか?

誰かが何か別のものを提案できたら、私は非常に感謝しています。

+0

「サービス」アンドロイドの点では? –

答えて

0

では、次のしていると仮定します

  • Applicationクラスを。
  • WizardManager;
  • SomeWizardDataEntity;

あなたはすなわち、ApplicationクラスでWizardManagerを作成し、ウィザードのフローのデータエンティティでこれを使用することができます:

//BaseFragment: 
WizardManager manager = getApplication().getWizardManager(); 
SomeWizardDataEntity entity = manager.getWizardEntity(); 

//Fragment1: 
entity.addSomeData(); 

//Fragment2: 
entity.addSomeData2(); 

//Fragment3: 
entity.addSomeData3(); 

//Fragment4: 
entity.addSomeData4(); 
manager.wizardFlowFinihed(); 

だからあなたはApplicationクラスまで生きますWizardManagerの非シングルトンインスタンスを持つことになります生きている。

その後、あなたはすなわち、このエンティティをmokingいくつかのテストを書くことができます。:

@Mock 
WizardManager mWizardManager; 

//start some fragment 

verify(entity, times(1)).addSomeData(); 
verify(manager, times(1)).wizardFlowFinihed(); 
関連する問題