23のデザインパターン(3) - クリエータモード

1.定義

複合オブジェクトが作成され、使用して、彼の分離を示し、同じ作成プロセスを異なる表現(クラス属性の異なるインスタンス)を作成することができます。

2、UML 图

8fHV6x.png

図3に示すように、組成物

  • 製品カテゴリ(製品):一般的に、より複雑なカテゴリが、つまり、より複雑なプロセスのクラスインスタンスを作成します
  • 抽象クラスの作成者(IProductBuilder) 抽象インタフェース・クラスの作成者、このインタフェースを実装できるクラスを作成するために、異なる製品のオブジェクトを作成する手順を定義して、独自の実現を設計します
  • クリエーター(ProductABuilder、ProductBBuilder) オブジェクトの特定のインスタンスを作成する責任は、クラスを作成するプロセスをカプセル化します。そこには、一般的に製品を作成し、作成されたオブジェクトを返すために2つの段階、すなわち段階に分類されています
  • ディレクターのカテゴリ(監督):製品を作成するために、適切な作成者を呼び出すための責任一般的に、直接、インタラクティブ、製品カテゴリの作成者と直接対話しません

図4に示すように、コード

// 复杂的对象,产品类
public class Product {
    private List<String> parts = new ArrayList<>();

  	// 需要添加多个组件才能创建产品
    public void addPart(String part) {
        this.parts.add(part);
    }

    public void show() {
        System.out.println("本产品所有组件有:" + parts.toString());
    }
}

// 抽象创建者
public interface IProductBuilder {
  	// 创建步骤
    void buildPart1();
    void buildPart2();
		// 获得创建好的产品
    Product getProduct();
}

// A产品的创建者
public class ProductABuilder implements IProductBuilder {
    private Product product = new Product();

    // 创建A产品的步骤1
    @Override
    public void buildPart1() {
        product.addPart("产品A-部件1");
    }

    // 创建A产品的步骤2
    @Override
    public void buildPart2() {
        product.addPart("产品A-部件2");
    }

    @Override
    public Product getProduct() {
        return product;
    }
}

// B产品的创建者
public class ProductBBuilder implements IProductBuilder {

    private Product product = new Product();

    // 创建产品B的步骤1
    @Override
    public void buildPart1() {
        product.addPart("产品B-部件1");
    }

    // 创建产品B的步骤2
    @Override
    public void buildPart2() {
        product.addPart("产品B-部件2");
    }

    @Override
    public Product getProduct() {
        return product;
    }
}

// 导演类,负责调用创建者生成对象
public class Director {
    public Product getProduct(IProductBuilder builder){
        builder.buildPart1();
        builder.buildPart2();
        return builder.getProduct();
    }
}

// 调用者
public class Main {
    public static void main(String[] args) {
        Director director = new Director();
        Product productA = director.getProduct(new ProductABuilder());
        Product productB = director.getProduct(new ProductBBuilder());

        productA.show();
        productB.show();
    }
}

結果:

本产品所有组件有:[产品A-部件1, 产品A-部件2]
本产品所有组件有:[产品B-部件1, 产品B-部件2]

5、利点

  • パッケージが良いです。パッケージを作成するプロセスは、呼び出し側は、複雑なオブジェクトの作成プロセスを心配する必要はありません。
  • 良いを拡大。新製品は、唯一の既存のコードを変更せずに、製品の作成者を追加する必要がある場合

6、及びファクトリーモードの間の差

見つけることができ、作成者モードと工場出荷時のパターンは非常に似て、オブジェクトのインスタンスを作成するために使用され、その差はモード作成者よりもあるディレクターのカテゴリ

工場出荷時のパターンと比較すると、作成者モードでは、主に作成するために使用され、より複雑なオブジェクトを必要が別のクラスを分離するように作成されたオブジェクトは、より複雑であるため、そのクラスのディレクターが作成され、このプロセスに関与すると、およびファクトリクラスは、直接オブジェクトを作成します。

7、アプリケーションのシナリオ

主に、より複雑なオブジェクトの一部を作成するために使用され、内部にそれらのオブジェクトのビルド順序は、一般的に安定しているが、オブジェクトのコンストラクタのパラメータ/属性が異なることになります。あなたがオブジェクトを作成するのであれば、工場出荷時のパターンを使用して、より複雑であり、オブジェクトは、作成者モードを使用するように特別な責任を作成する場合。

おすすめ

転載: www.cnblogs.com/moongeek/p/12549681.html