blog

Androidデザインパターン・シリーズ - ファクトリーメソッド・パターン

androidで使われるファクトリクラスは非常に多く、その中には有用なファクトリメソッドパターンもありますが、もちろんファクトリメソッドパターンを使わず、単なるツール管理クラスとして使われているファク...

Nov 11, 2013 · 4 min. read
シェア

ファクトリメソッドパターンは、多くの場合、設計パターンの初心者は、確かに、何人かの人々はそれが最も典型的な***インスパイア効果と呼ばれることから始めるパターンです。

ファクトリメソッドパターンのために有用であるあまりにも多くのファクトリクラスの使用でアンドロイドは、もちろん、また、多くの工場があるファクトリメソッドパターンの使用ではなく、単にツールの管理クラスです。

今日は、単純なファクトリパターンとファクトリメソッドパターンを説明する例としてThreadFactoryを取ります。

ファクトリメソッドパターンは、ファクトリメソッドは、単純な方法は、単純なアプリケーションではありません。

1.意図

オブジェクトを作成するためのインターフェースを定義し、どのクラスをインスタンス化するかをサブクラスに決定させます。ファクトリー・ウェイ・パターンは、クラスのインスタンス化をサブクラスに遅らせます。

TOPICS

2.構造とコード

まず、標準的なファクトリーメソッドの構造図を見てみましょう:



最初の抽象的な製品クラス、抽象的なファクトリクラス、および対応する特定の製品を生産するクライアントの特定のファクトリを使用しますが、クライアントは、特定の製品が生産される方法を知らない、生産プロセスは、ファクトリにカプセル化されます。だから、ある程度、ファクトリーメソッドパターンは、新しい、良いスタートを、重要な直接オブジェクトを作成する方法を変更します。

例としてThreadFactoryを取ります:

この図は、実際には、ファクトリーにパラメータ化され、ビジネス感覚からも多少異なりますが、アイデアは同じであることを、イメージの元の構造とのわずかな違いです。

具体的なコードを見てください:

//抽象的な製品  
public interface Runnable {  
    public abstract void run();  
}  
   
//抽象ファクトリー  
public interface ThreadFactory {  
    Thread newThread(Runnable r);  
}  

以下に具体的な実装を示します:

例えば、AsyncTaskクラスのファクトリーの具体的な実装は以下のようになります:

//ファクトリー実装クラス  
private static final ThreadFactory sThreadFactory = new ThreadFactory() {  
    private final AtomicInteger mCount = new AtomicInteger(1);  
  
    public Thread newThread(Runnable r) {  
        return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());  
    }  
};  
//では、製品クラスはどこにあるのか?  
//做为参数Runnable r,可以创建千千万万个此系列的产品类  
//同様に、ある種の特殊なスレッドを生成するために、別の同様のファクトリーを作成することができる。  

ここで、一方では、その生産感嘆詞の便宜のために、一方では、工場を作成し、面倒な感じの製品の特定のタイプを作成しなかったので、次の単純な工場は、その構造は次のとおりです:



シンプルなファクトリーは抽象的なファクトリーを取り除き、特定のタイプの製品に特化したプロダクションを作成するだけです。このパターンを特定の非責任領域に適用するには、非常に実用的で便利な方法です。

アンドロイドのConnectionクラスはこのクラスを使っています:



抽象クラスの1つであるConnectionは、抽象プロダクトクラスと具象ファクトリークラスの両方の役割を果たします。

このような状況のため、多くの場合、すぐにサブクラスを生成する必要があるため、getConnectionメソッドは、多くの場合、静的なので、単純なファクトリは、静的ファクトリメソッドとも呼ばれます。

次のようにコードを見てください:

abstract class Connection{      
    static Connection getConnection(  
            Context context, HttpHost host, HttpHost proxy,  
            RequestFeeder requestFeeder) {  
   
        if (host.getSchemeName().equals("http")) {  
            return new HttpConnection(context, host, requestFeeder);  
        }  
   
        // Otherwise, default to https  
        return new HttpsConnection(context, host, proxy, requestFeeder);  
    }  
}  

これはシンプルファクトリーで、とてもシンプルなパラメトリックファクトリーです。

3.効果

1.創造型モード。

2.適切なオブジェクトを取得するためのパラメータ化されたファクトリーメソッドパターン。

3.サブクラスへのフックの提供。

4.並列クラス階層の接続。

Read next

Android開発者に欠かせない42のリンク

以下は、Androidの学習に役立つコンテンツへの42のリンク集です。Android開発を一から学ぶのに役立つ初心者向けのコンテンツもあれば、より上級の開発者向けのコンテンツもあります。このおすすめコンテンツがお役に立てば幸いです。

Nov 9, 2013 · 8 min read