設計モデル(一):簡単な工場


単純なファクトリモードは、厳密には標準的な設計モードではなく、一般的にターゲットクラスをインスタンス化するための静的クラスとして実現されるため、静的ファクトリとも呼ばれる.
通常、クライアントが1つのインタフェースを実装した複数のインスタンスクラスから1つのインスタンスを選択して使用する場合、クライアントに内部実装の詳細を露出させないように、単純なファクトリクラスを使用して、外部に統一的な使用インタフェースを提供することができる.これにより,対外的にパッケージ分離,すなわちインタフェース向けプログラミングが実現される.
アンドロイドの開発で使用される実際のシーンを例に挙げます.
アプリケーションには、薬品情報、養生情報、救急情報など、サーバから要求された異なる分類の情報がたくさんあります.各種類の情報はユーザーがローカルにコレクションすることをサポートして、オフラインで表示して、ローカルストレージを行う時に実現する上でそれぞれ違いがありますが、彼らは対外的にいくつかの統一機能を提供するべきです.例えば、addFav(コレクションを追加)、delFav(コレクションを削除)、favExists(この情報をコレクションしたかどうか)、query(ローカルコレクションの情報を検索します).ルールをインタフェースとして抽象化し、次のように実現します.

  
  
  
  
  1. public interface IFavService {      
  2.  public boolean addFav(HashMap<String, String> data);      
  3.  public boolean delFav(String id);      
  4.  public boolean favExists(String id);      
  5.  public ArrayList<HashMap<String, Object>> query(int start, int size);    
  6. }  

 各種類の情報に対してローカルコレクションを実現する実現クラスは、すべてこのインタフェースを実現する.
薬品コレクションの実現:

  
  
  
  
  1. public class MedicinalFavorService implements IFavService {   
  2. public MedicinalFavorService(Context context) {   }
  3. public boolean addFav(HashMap<String, String> medicinal){    }      
  4. public boolean delFav(String id)  {    }      
  5. public boolean favExists(String id) {    }      
  6. public ArrayList<HashMap<String,Object>> query(int start, int size) {    }   
  7. }  

養生コレクションの実現:

  
  
  
  
  1. public class YangShengFavorService implements IFavService {  
  2. public YangShengFavorService (Context context) { }    
  3. public boolean addFav(HashMap<String, String> medicinal){    }      
  4. public boolean delFav(String id) {     }      
  5. public boolean favExists(String id) {    }      
  6. public ArrayList<HashMap<String,Object>> query(int start, int size) {    }   

救急コレクションの実現:

  
  
  
  
  1. public class FirstAidFavorService implements IFavService {
  2. public FirstAidFavorService (Context context) { }
  3. public boolean addFav(HashMap<String, String> medicinal){ }
  4. public boolean delFav(String id) { }
  5. public boolean favExists(String id) { }
  6. public ArrayList<HashMap<String,Object>> query(int start, int size) { }
  7. }

クライアントでの呼び出し方法:
IFavService ifs = new MedicinalFavorService(this);
//IFavService ifs = new YangShengFavorService(this);
//IFavService ifs = new FirstAidFavorService(this);
ifs.メソッド //IFavService インタフェース宣言の方法
しかし、このように1つの問題があって、クライアント(クラス)は呼び出す時具体的な実現クラス名を知る必要があって、つまりコレクションの内部の実現を暴露して、このようにカプセル化を破壊して、最小限の知識の原則にも背いて、今私達はインタフェースの思考に向かって、カプセル化して、クライアントの呼び出しと内部の実現の隔離を達成します.
ここでは簡単な工場を使います.実現方法を見る:
工場クラスを宣言します.

  
  
  
  
  1. public class GetFavorServiceFactory {
  2. public static IFavService getFavorService(Context context, String flag){
  3. if("yaoping".equals(flag)){
  4. return MedicinalFavorService.getService(context);
  5. }else if("yangsheng".equals(flag)){
  6. return YangShengFavorService.getService(context);
  7. }else if("jijiu".equals(flag)){
  8. return FirstAidFavorService.getService(context);
  9. }
  10. return null;
  11. }
  12. }

クライアント呼び出しコードを変更するには、次の手順に従います.

  
  
  
  
  1. IFavService ifs = GetFavorServiceFactory.getFavorService(this,"yaoping");
  2. //IFavService ifs = GetFavorServiceFactory.getFavorService(this,"yangsheng");
  3. //IFavService ifs = GetFavorServiceFactory.getFavorService(this,"jijiu");

これにより、クライアント・コールは1つのGetFavorServiceFactoryクラスと対話するだけで、医薬品コレクションまたは他のコレクションを変更してクラス名を実装したり、他の変更を行ったりする場合、クライアント・コードは呼び出された場所を再見つけて修正する必要はありません.
これが単純なファクトリモードの応用シーンです.
文中の不足点を指摘し、共同で討論し、向上することを歓迎します.(QQ:115520509)