2017-07-13 12 views
0

私は最近仕事を変更しました。大規模なオンライン小売店向けのWebSphere Commerceプロジェクトで作業しています。コード内には、さまざまなサービスのインスタンスを取得するためのさまざまな工場があります。しかし、彼らがやっていることはすべて毎回新しいオブジェクトを返すことです。例えばシングルトンを使用した場合や新しいオブジェクトインスタンスを使用した場合は何か違いはありますか?

public class DataAccessServiceFactory { 

    public static DataAccessService getDataAccessService(){ 
    return new DataAccessService(); 
    } 

これはアンチパターンのように感じられ、リソースを不必要に使い果たしてしまう可能性があります。代わりに、シングルトンインスタンスを返す必要があります。これらのサービスには、1つまたは2つのプライベートフィールドしか存在しない場合がありますが、何百万人ものユーザーがいるため、何百万もの不要なオブジェクトが存在します。

工場を呼び出さずに新しいオブジェクトを作成することができるので、ファクトリー自体は多少意味がありませんが、これは実世界での使用に実際には何の違いもあります。あなたはそれを使用する必要があるたびに新しいサービスですか?

[編集] もう少し詳しく: これらのサービスを使用してルックアップ製品やカートに追加するなど、データベース内のエントリをクエリまたは作成するために使用されるさまざまなRESTサービスがあります。サービス自体はステートレスです。

+0

方法多くのスレッドがこのgetDataAccessServiceメソッドにアクセスしますか? DataAccessServiceにスレッド間で共有する必要がある状態がありますか?無関係ここにはどのようなユースケースがありますか? – SMA

答えて

0

DataAccessServiceがステートレスでない場合(たとえば、非アクティブでアクティブな場合があり、各ユーザーがロジックに従って更新する場合など)、シングルトンにすることはできません。

0

一般的に、サービスには状態はありませんが、データを処理し、DAOレイヤーとUser/Frontendの間のブリッジを形成するメソッドはありません。サービスにクラスレベルのオブジェクトがない場合は、ファセットを使用して新しいインスタンスを返すロジックはあまりありません。

0

DataAccessServiceに状態がある場合、それはシングルトンであってはなりません。 100万人のユーザーはすべて、クラスの各属性ごとに独自の値を持ち、共有することはマルチユーザー/マルチスレッド環境での同期障害になります。

このクラスの利点は、依存性の逆転に関係している可能性があります。 SubDataAccessService(extends DataAccessService)のように、DataAccessServiceを作成するための新しいメカニズムが新しいクラスとして実装された場合、getDataAccessService()で戻り値の型が更新されると、getDataAccessService()を呼び出すすべてのクラスは新しいサブタイプを受け取ります。これは本当に実装に依存質問です

new SubDataAccessService() 
+0

あなたが言うことは理にかなっていますが、必要なときに戻される静的インスタンスが存在しない理由がまだ説明されていません。 – lifesoordinary

0

new DataAccessService() 

と呼ばれるすべてのコードをリファクタリングする必要性を防止するであろう。

シングルトンの欠点は、スコープの終わりに通常のオブジェクトのように割り当てが解除されないため、メモリに長時間存在することです。

また、キャッシュメモリやメモリリークが発生すると、多くのメモリが使用される可能性があります。一方、

、それは多くのオブジェクトで再利用できるものであれば、それは(データベースに接続する必要があるDAOオブジェクトのように)初期化するには時間がかかる場合は特にそれは非常に有益である可能性が

関連する問題