Java デザイン パターン -- クリエーター パターン

参考:Javaの一般的なデザインパターンのまとめ

コンセプト

概念的な理解 1 : 複雑なオブジェクトの作成プロセスはさまざまな方法に分解され、さまざまな作成プロセスがさまざまなオブジェクトに組み立てられます。オブジェクトの作成が製品自体から分離されているため、オブジェクトの作成プロセスがより明確になります。例: 旅行商品の販売シーン。
パッケージには、航空券、鉄道チケット、ホテル、景勝地のチケットが含まれる可能性があります。
パッケージ A: 航空券 1 + ホテル 1 + アトラクション チケット 1パッケージなどパッケージ C: 航空券 1 + ホテル 1
B: チケット 1 + アトラクション チケット 2 1. Mybaitis製品のコンストラクター パラメーターが多すぎるか、組み合わせが多すぎるため、SqlSessionFactoryBuilder と SqlSessionFactoryBuilderが返されます。 2. set メソッドをStringBuilder、StringBuffer.append()に変換します。







抽象ビルダー ビルダー: アーキテクチャ ブループリントと同等で、Product オブジェクトを作成する各コンポーネントによって指定される抽象インターフェイスを宣言します。
特定のビルダー ConcreteBuilder: Builder 抽象インターフェイスを実装し、さまざまなパーツを構築および組み立て、作成する表現を定義および指定し、プロダクトを取得するためのインターフェイスを提供します。
Commander Director: Builder インターフェイスを使用してオブジェクトを構築します。主な機能は 2 つあり、1 つはユーザーとオブジェクトの製造プロセスを分離することで、もう 1 つは製品オブジェクトの製造プロセスを制御する役割です。
製品の役割 製品: 構築される複雑なオブジェクト。ConcreteBuilder は、製品の内部表現を作成し、そのアセンブリ プロセスを定義します。これには、構成部品を定義するクラスや、それらの部品を最終製品に組み立てるためのインターフェイスが含まれます。

抽象コンストラクター

@Data
public abstract class Builder {
    
    
    Package pack = new Package();
    public abstract void buildAirTicket();
    public abstract void buildHotel();
    public abstract void buildTripTicket();
    public abstract void buildCarTicket();

    public Package getPack(){
    
    
        return pack;
    }
}

パッケージ A の具体的なコンストラクター PackageAConcreteBuilder

@Data
public class PackageAConcreteBuilder extends Builder {
    
    
//    套餐A: 机票1 + 酒店1 + 景点门票1
    @Override
    public void buildAirTicket() {
    
    
        AirTicket airTicket1 = new AirTicket(1000, 999, "机票1", "0001", 200);
        pack.setAirTicket(airTicket1);
    }

    @Override
    public void buildHotel() {
    
    
        Hotel hotel1 = new Hotel(300, 999, "酒店1", 2);
        pack.setHotel(hotel1);
    }

    @Override
    public void buildTripTicket() {
    
    
        TripTicket tripTicket1 = new TripTicket(50, 9999, "景点门票1");
        pack.setTripTicket(tripTicket1);
    }

    @Override
    public void buildCarTicket() {
    
    
        return;
    }

    @Override
    public Package getPack() {
    
    
        return super.getPack();
    }
}

パッケージ B コンクリート コンストラクター PackageBConcreteBuilder

@Data
public class PackageBConcreteBuilder extends Builder{
    
    
//    套餐B: 车票1 + 景点门票2
    @Override
    public void buildAirTicket() {
    
    

    }

    @Override
    public void buildHotel() {
    
    

    }

    @Override
    public void buildTripTicket() {
    
    
        TripTicket tripTicket2 = new TripTicket(30, 9999, "景点门票2");
        pack.setTripTicket(tripTicket2);
    }

    @Override
    public void buildCarTicket() {
    
    
        CarTicket carTicket1 = new CarTicket(50, 9999, "车票1","0876");
        pack.setCarTicket(carTicket1);
    }

    @Override
    public Package getPack() {
    
    
        return super.getPack();
    }
}

パッケージ モデルのオブジェクト クラス Package は、図の Product に相当します。

@Data
public class Package {
    
    
    AirTicket airTicket;
    Hotel hotel;
    TripTicket tripTicket;
    CarTicket carTicket;

    public Package() {
    
    
    }

    public Package(AirTicket airTicket, Hotel hotel, TripTicket tripTicket, CarTicket carTicket) {
    
    
        this.airTicket = airTicket;
        this.hotel = hotel;
        this.tripTicket = tripTicket;
        this.carTicket = carTicket;
    }
}

コンストラクタ

@Data
public class SystemDirector {
    
    
    private Builder builder;

    public void setBuilder(Builder builder){
    
    
        this.builder = builder;
    }
    public Package ConcreteBuilder(){
    
    
        builder.buildAirTicket();
        builder.buildHotel();
        builder.buildCarTicket();
        builder.buildTripTicket();

       return builder.getPack();
    }
}

使い方

public static void main(String[] args){
    
    
        SystemDirector systemDirector = new SystemDirector(); // 指挥者
        PackageAConcreteBuilder packageABuilder = new PackageAConcreteBuilder();
        PackageBConcreteBuilder packageBBuilder = new PackageBConcreteBuilder();

        systemDirector.setBuilder(packageABuilder);// 指挥操作套餐A
        Package packageA = systemDirector.ConcreteBuilder();//套餐A的具体构造者创造对象     log.info("packageA,airTicket:{},hotel:{},tripTicket:{}",packageA.airTicket.getName(),
                packageA.hotel.getName(),packageA.tripTicket.getName());

        systemDirector.setBuilder(packageBBuilder);// 指挥操作套餐B
        Package packageB = systemDirector.ConcreteBuilder();//套餐B的具体构造者创造对象
        log.info("packageB,carTicket:{},tripTicket:{}",packageB.carTicket.getName(), packageB.tripTicket.getName());
    }

おすすめ

転載: blog.csdn.net/Misszhoudandan/article/details/131221447