[GO] [Viererbande] Design Pattern Learning - Builder

Baumeister-Konstruktor

** Inhaltsverzeichnis ** Wenn Abstract Factory, wie der Name schon sagt, eine Fabrik ist und die Möglichkeit bietet, jedes Teil herzustellen, ist dieses Muster eine Kombination von Teilen ** Produkt ( Was ist das Bild von ** Massenproduktion ** (zusammengesetzte Objekte) **?

Zweck

Indem der Erstellungsprozess eines zusammengesetzten Objekts vom Ausdrucksformat unabhängig gemacht wird, können Objekte mit unterschiedlichen Ausdrucksformaten im selben Erstellungsprozess generiert werden.

Komponente

Implementierung

Die Ersteller erstellen eine Stadt mit dem folgenden Ablauf.

Bitten Sie einen professionellen Bauunternehmer, das Gebäude zu bauen, das Sie bauen möchten-> Legen Sie die Anzahl der Stockwerke und Räume im Gebäude fest-> Bitten Sie ihn, so viele zu bauen, wie Sie möchten

Abstrakte Klasse zum Generieren der Builder-Produktklasse

Builder-Oberfläche

Builder.kt


package builder

interface Builder {
    enum class ProductType(val value: String) {
        ArtMuseum("Museum"),
        Museum("Museum"),
        MovieTheater("Kino")
    }

    fun getProduct(): Product
    fun addFloor(floorNum: Int)
    fun addRoom(targetFloor: Int, roomNo: Int)

}

ConcreteBuilder ConcreteBuilder-Klasse. Produktklasse generieren

Museumsfachbauer Betonklasse

MuseumBuilder.kt


package builder

class MuseumBuilder(productName: String): Builder {
    private var product = Product(Builder.ProductType.Museum, productName)

    override fun getProduct(): Product {
        product.countUpProductNumber()
        return product.clone() as Product
    }

    override fun addFloor(floorNum: Int) {
        if (product.floorList.asSequence().filter { floor -> floor.floorNum == floorNum }.count() == 0) {
            product.floorList.add(Floor(floorNum))
        }
    }

    override fun addRoom(targetFloor: Int, roomNo: Int) {
        val floor= product.floorList.filter { floor -> floor.floorNum== targetFloor }
        if (floor.count() > 0) {
            floor[0].addRoom(roomNo)
        }
    }

}

Museumsfachbauer Betonklasse

ArtMuseumBuilder.kt


package builder

class ArtMuseumBuilder(productName: String) : Builder {
    private var product = Product(Builder.ProductType.ArtMuseum, productName)

    override fun getProduct(): Product {
        product.countUpProductNumber()
        return product.clone() as Product
    }

    override fun addFloor(floorNum: Int) {
        if (product.floorList.asSequence().filter { floor -> floor.floorNum == floorNum }.count() == 0) {
            product.floorList.add(Floor(floorNum))
        }
    }

    override fun addRoom(targetFloor: Int, roomNo: Int) {
        val floor= product.floorList.filter { floor -> floor.floorNum== targetFloor }
        if (floor.count() > 0) {
            floor[0].addRoom(roomNo)
        }
    }

}

Filmfachmann Baumeister Betonklasse

MovieTheaterBuilder.kt


package builder

class MovieTheaterBuilder(productName: String): Builder {
    private var product = Product(Builder.ProductType.MovieTheater, productName)

    override fun getProduct(): Product {
        product.countUpProductNumber()
        return product.clone() as Product
    }

    override fun addFloor(floorNum: Int) {
        if (product.floorList.asSequence().filter { floor -> floor.floorNum == floorNum }.count() == 0) {
            product.floorList.add(Floor(floorNum))
        }
    }

    override fun addRoom(targetFloor: Int, roomNo: Int) {
        val floor= product.floorList.filter { floor -> floor.floorNum== targetFloor }
        if (floor.count() > 0) {
            floor[0].addRoom(roomNo)
        }
    }

}

Sie können den Abschnitt vom Gebäude zum Raum überspringen.

Produkt Ein zusammengesetztes Objekt, das aus vielen Komponenten besteht

Bauklasse

Product.kt


package builder

class Product(productType: Builder.ProductType, productName: String): Cloneable {

    var productType = productType
    val floorList: MutableList<Floor> = mutableListOf()
    var productName = productName
    var productNumber = 0

    fun countUpProductNumber() {
        productNumber++
    }

    fun show(): String {
        var ret = "【Gebäude】${productType.value}:$productName$productNumber Gebäude"
        for (floor in floorList) {
            ret += floor.show()
        }
        return ret
    }

    public override fun clone(): Any {
        return super.clone()
    }

}

Hierarchische Klasse 1. Stock 2. Stock ...

Floor.kt


package builder

class Floor(floorNum: Int) {
    var floorNum = floorNum
    private val roomList:MutableList<Room> = mutableListOf()

    fun addRoom(roomNo: Int) {
        if (roomList.asSequence().filter { room -> room.roomNo == roomNo }.count() == 0) {
            roomList.add(Room(roomNo))
        }
    }

    fun show(): String {
        var ret: String = "【Hierarchie】$BodenNum Boden"
        for (room in roomList) {
            ret += room.show()
        }
        return ret
    }
}

Raumklasse

Room.kt


package builder

class Room(roomNo: Int) {
    val roomNo = roomNo

    fun show(): String {
        return "【Zimmer】$ZimmerKein Zimmer"
    }
}

Erstellen Sie ein Objekt über die Schnittstelle der Director Builder-Klasse

City Maker Klasse

Creator.kt


package builder

class Creator {
    init {
        var productList:MutableList<Product> = mutableListOf()

        //Bitten Sie einen Museumsspezialisten, ein westliches Museum zu bauen
        var artMuseumBuilder1 = ArtMuseumBuilder("Westliches Museum").apply {
            addFloor(1)
            addFloor(2)
            addFloor(3)
            addRoom(1, 101)
            addRoom(1, 102)
            addRoom(2, 201)
            addRoom(3, 301)
        }
        //Bitten Sie einen Museumsspezialisten, das Orientalische Museum zu bauen
        var artMuseumBuilder2 = ArtMuseumBuilder("Orientalisches Museum").apply {
            addFloor(1)
            addFloor(2)
            addRoom(1, 101)
            addRoom(2, 201)
        }

        //Bitten Sie einen Museumsspezialisten, ein nationales Museum zu bauen
        var museumBuilder = MuseumBuilder("Nationalmuseum").apply {
            addFloor(1)
            addRoom(1, 101)
        }
        //Bitten Sie einen Kinospezialisten, Hoge-Kinos zu bauen
        var movieTheaterBuilder = MovieTheaterBuilder("HOGE Kinos").apply {
            addFloor(1)
            addRoom(1, 101)
        }

        //Erstellen Sie eine Liste, die in der Stadt erstellt werden soll
        productList.add(artMuseumBuilder1.getProduct())
        productList.add(artMuseumBuilder1.getProduct())
        productList.add(artMuseumBuilder1.getProduct())
        productList.add(artMuseumBuilder2.getProduct())
        productList.add(artMuseumBuilder2.getProduct())
        productList.add(museumBuilder.getProduct())
        productList.add(movieTheaterBuilder.getProduct())

        for (product in productList) {
            println(product.show())
        }

    }
}

Die Schöpfer überlegen, welche Art von Gebäude sie in der Stadt bauen möchten, fragen jeden Bauherrn und bitten sie, so viel zu bauen, wie sie brauchen. War es leichter zu verstehen, ob es sich um ein Lebensmittelgeschäft handelte?

Es ist eine einfache Struktur, da nicht geholfen werden kann, sie zu stark zu machen. Wenn Sie jedoch zulassen, dass die Produktklasse die Adresseigenschaft enthält und sie jedes Mal, wenn Sie die Adresseigenschaft festlegen können, "getProduct ()" erstellt, wird mehr Image angezeigt. War es einfach?

Mit dem oben Gesagten wurde der Zweck der ** Massenproduktion ** von ** Produkten (Verbundgegenständen) ** erreicht. Ich möchte mitten im Bau einer Stadt ein weiteres Kino hinzufügen! Sie können dasselbe Gebäude auch ** duplizieren (Masse) **, indem Sie `movieTheaterBuilder.getProduct ()` `aufrufen. Das return product.clone () as Product`` jeder Builder # getProduct () -Methode leistet gute Arbeit.

Ausgabeergebnis

[output]
[Gebäude] Museum:Western Museum 1. Gebäude [Ebene] 1. Stock [Raum] Raum 101 [Raum] Raum 102 [Ebene] 2. Stock [Raum] Raum 201 [Ebene] 3. Stock [Raum] Raum 301
[Gebäude] Museum:Western Museum 2. Gebäude [Ebene] 1. Stock [Raum] Raum 101 [Raum] Raum 102 [Ebene] 2. Stock [Raum] Raum 201 [Ebene] 3. Stock [Raum] Raum 301
[Gebäude] Museum:Western Museum 3. Gebäude [Ebene] 1. Stock [Raum] Raum 101 [Raum] Raum 102 [Ebene] 2. Stock [Raum] Raum 201 [Ebene] 3. Stock [Raum] Raum 301
[Gebäude] Museum:Orientalisches Museum 1. Gebäude [Ebene] 1. Stock [Raum] Raum 101 [Ebene] 2. Stock [Raum] Raum 201
[Gebäude] Museum:Orientalisches Museum 2. Gebäude [Ebene] 1. Stock [Raum] Raum 101 [Ebene] 2. Stock [Raum] Raum 201
[Gebäude] Museum:Nationalmuseum 1. Gebäude [Ebene] 1. Stock [Raum] Raum 101
[Gebäude] Kino:HOGE Cinemas 1. Gebäude [Ebene] 1. Stock [Raum] Raum 101

Wenn Sie `product.clone ()` nicht ausführen, erhalten Sie das folgende Ergebnis, das ein nutzloser Builder ist.

[output]
[Gebäude] Museum:Westliches Museum 3. Gebäude...
[Gebäude] Museum:Westliches Museum 3. Gebäude...
[Gebäude] Museum:Westliches Museum 3. Gebäude...
[Gebäude] Museum:Das zweite Gebäude des Orientalischen Museums...
[Gebäude] Museum:Das zweite Gebäude des Orientalischen Museums...
[Gebäude] Museum:Nationalmuseum 1. Gebäude...
[Gebäude] Kino:HOGE Kinos 1...

Recommended Posts

[Viererbande] Design Pattern Learning - Builder
[Viererbande] Designmuster lernen
[Viererbande] Design Pattern Learning - Singleton
[Viererbande] Design Pattern Learning --Decorator
[Viererbande] Designmuster lernen --Besucher
[Viererbande] Design Pattern Learning - Vermittler
[Viererbande] Designmusterlernen --Iterator
[Viererbande] Designmuster lernen - Fassade
[Viererbande] Designmuster lernen - Prototyp
[Viererbande] Designmuster lernen - Andenken
[Viererbande] Designmuster lernen - Staat
[Vierergruppe] Design Pattern Learning - Interpreter
[Viererbande] Designmuster lernen - Brücke
[Viererbande] Designmuster lernen --Proxy
[Viererbande] Design Pattern Learning - Strategie
[Viererbande] Designmuster lernen --Adapter
[Viererbande] Design Pattern Learning - Beobachter
[Viererbande] Designmuster lernen - Befehl
[Viererbande] Designmuster lernen - Fluggewicht
[Viererbande] Designmusterlernen - Abstract Factory
[Viererbande] Designmuster lernen - Fabrikmethode
[Viererbande] Designmuster lernen - Kette der Verantwortung
[Viererbande] Design Pattern Learning - Template-Methode
Entwurfsmuster #Builder
Lernen Sie das Entwurfsmuster "Builder" mit Python
Gang of Four (GoF) -Muster in Python
Entwurfsmuster #Adapter
Entwurfsmuster #Decorator
Lernen der Mustererkennung im Video Teil 1 Bereich der Mustererkennung
Entwurfsmuster #Observer
Entwurfsmuster #Facade
Entwurfsmuster #Strategie
Entwurfsmuster #Singleton
Entwurfsmuster #Proxy
Ich habe ein Designmuster in der Kotlin Builder Edition geschrieben
Lernen Sie das Entwurfsmuster "Chain of Responsibility" in Python
Deep Learning 1 Übung des Deep Learning
Entwurfsmuster # Template-Methode
Die Geschichte, dass GoF-Designmuster nichts anderes sind als "Einführung abstrakter Ebenen"