@634

Abstract Factory パターン

Advertisement

抽象的な工場を作る

製品を作成する工場と、その工場が作成する製品を共に抽象化することにより、クライアントが目的にあった工場を選択できるようにする。

特徴

工場を抽象化する。

クライアントが指定する工場により、作成できる製品が異なる。

最大限に抽象化を行う

工場と製品を共に抽象化することにより、組み合わせを柔軟に指定できる。

どんなときに有効か。

部品の組み合わせパターンが多いときに有効。
組み合わせて使うサブクラス群をまとめて切り替えるときに有効。

サンプルコード

※上手くまとまっていないので、後日修正予定。

Factory クラス(抽象的な工場)
abstract class Factory{
    public abstract Header getHeader();
    public abstract Body getBody(String document);
    public abstract Footer getFooter();
}

Item クラス(抽象的な部品)
abstract class Item{
    public abstract void print();
}

Body クラス(抽象的な部品)
abstract class Body extends Item{
}

Header クラス(抽象的な部品)
abstract public class Header extends Item{
}

Footer クラス(抽象的な部品)
abstract public class Footer extends Item{
}

-- ここまでが抽象的なクラス

NormalFactory クラス(具体的なクラス)
class NormalFactory extends Factory{
    public Header getHeader(){
        return new NormalHeader();
    }

    public Body getBody(String document){
        return new NormalBody(document);
    }

    public Footer getFooter(){
        return new NormalFooter();
    }
}

NormalHeader クラス(具体的なクラス)
public class NormalHeader extends Header{
    public void print(){
        System.out.println("--top--");
    }
}

NormalBody クラス(具体的なクラス)
public class NormalBody extends Body{
    private String document;
    public NormalBody(String document){
        this.document = document;
    }

    public void print(){
        System.out.println(document);
    }
}

NormalFooter クラス(具体的なクラス)
public class HtmlFooter extends Footer{
    public void print(){
        System.out.println("");
        System.out.println("");
    }
}

-- ここまでが具体的なクラス

Main クラス(クライアント)
class Main{
    public static void main(String[] args){
        Factory factory = new NormalFactory();
        printDocument(factory);
    }

    public static void printDocument(Factory factory){
        Header header = factory.getHeader();
        Body body = factory.getBody("一行目\r\n二行目");
        Footer footer = factory.getFooter();

        header.print();
        body.print();
        footer.print();
    }
}

かなり柔軟な構成。具体的には、新たにHTML形式で出力したくなった場合などに、既存のクラスに変更を加える必要が一切なく、Factoryと各部品を新たに作成するだけでよい。

抽象度をかなり高くしているため、一度定義した部品を自由に組み合わせて使用することができる。

部品が増えるとクラスが増えてしまう。新しい種類の部品を追加する場合、修正範囲が広がってしまう。などの欠点も持っている。

Advertisement

ショートカット

634
634ブログ
このカテゴリのトップページに戻る
Incubator(Pukiwiki)
634ラボ
   UIコレクションギャラリー
   ZO-3ジェネレーター

サイト検索


Y!ログール