[GO] [Gang of Four] Apprentissage des modèles de conception - Constructeur

Constructeur-Constructeur

** Table des matières ** Si Abstract Factory est, comme son nom l'indique, une usine et offre la possibilité de fabriquer chaque pièce, ce modèle est une combinaison de pièces ** produit ( Quelle est l'image de la ** production de masse ** (objets composites) **?

Objectif

En rendant le processus de création d'un objet composite indépendant du format d'expression, il est possible de générer des objets avec différents formats d'expression dans le même processus de création.

Composant

-Classe abstraite pour générer la classe de produit Builder -ConcreteBuilder Concrete Builder classe. Générer une classe de produit -Créer un objet en utilisant l'interface de la classe Director Builder -Produit Un objet composite composé de nombreux composants

la mise en oeuvre

Les créateurs créeront une ville avec le flux suivant.

Demandez à un constructeur professionnel de construire le bâtiment que vous souhaitez construire-> Décidez du nombre d'étages et de pièces du bâtiment-> Demandez-leur d'en construire autant que vous le souhaitez

Classe abstraite pour générer la classe de produit Builder

Interface du constructeur

Builder.kt


package builder

interface Builder {
    enum class ProductType(val value: String) {
        ArtMuseum("Musée"),
        Museum("Musée"),
        MovieTheater("Cinéma")
    }

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

}

ConcreteBuilder Classe ConcreteBuilder. Générer une classe de produit

Classe de béton de constructeur de spécialiste de musée

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)
        }
    }

}

Classe de béton de constructeur de spécialiste de musée

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)
        }
    }

}

Cours de béton spécialisé dans le cinéma

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)
        }
    }

}

Vous pouvez ignorer la section du bâtiment à la salle.

Produit Un objet composite composé de nombreux composants

Classe de construction

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 = "【bâtiment】${productType.value}:$productName$productNumber Building"
        for (floor in floorList) {
            ret += floor.show()
        }
        return ret
    }

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

}

Classe hiérarchique 1er étage 2ème étage ...

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 = "【hiérarchie】$floorNum étage"
        for (room in roomList) {
            ret += room.show()
        }
        return ret
    }
}

Classe de chambre

Room.kt


package builder

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

    fun show(): String {
        return "【chambre】$pas de chambre"
    }
}

Créer un objet à l'aide de l'interface de la classe Director Builder

Classe de créateur de ville

Creator.kt


package builder

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

        //Demandez à un constructeur spécialisé dans les musées de construire un musée occidental
        var artMuseumBuilder1 = ArtMuseumBuilder("Musée occidental").apply {
            addFloor(1)
            addFloor(2)
            addFloor(3)
            addRoom(1, 101)
            addRoom(1, 102)
            addRoom(2, 201)
            addRoom(3, 301)
        }
        //Demandez à un constructeur spécialiste du musée de construire le musée oriental
        var artMuseumBuilder2 = ArtMuseumBuilder("Musée oriental").apply {
            addFloor(1)
            addFloor(2)
            addRoom(1, 101)
            addRoom(2, 201)
        }

        //Demandez à un spécialiste des musées de construire un musée national
        var museumBuilder = MuseumBuilder("musée national").apply {
            addFloor(1)
            addRoom(1, 101)
        }
        //Demandez à un spécialiste du cinéma pour construire les cinémas Hoge
        var movieTheaterBuilder = MovieTheaterBuilder("Cinémas HOGE").apply {
            addFloor(1)
            addRoom(1, 101)
        }

        //Créer une liste à construire dans la ville
        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())
        }

    }
}

Les créateurs réfléchissent au type de bâtiment qu'ils veulent construire dans la ville, demandent à chaque constructeur de construire autant qu'il en a besoin. Était-il plus facile de comprendre s'il s'agissait d'un dépanneur?

C'est une structure simple car on ne peut pas l'aider à en faire trop, mais si vous laissez la classe Product détenir la propriété address et la faire construire getProduct () '' `` chaque fois que vous pouvez définir la propriété address, ce sera plus d'image. C'était facile?

Avec ce qui précède, l'objectif de la ** production de masse ** de ** produits (objets composites) ** a été atteint. Je veux ajouter une autre salle de cinéma au milieu de la construction d'une ville! Vous pouvez également ** dupliquer (en masse) ** le même bâtiment en appelant movieTheaterBuilder.getProduct () ''. Le `` return product.clone () as Product '' de chaque méthode Builder # getProduct () fait du bon travail.

Résultat de sortie

[output]
[Bâtiment] Musée:Western Museum 1er bâtiment [Niveau] 1er étage [Salle] Salle 101 [Salle] Salle 102 [Niveau] 2e étage [Salle] Salle 201 [Niveau] 3e étage [Salle] Salle 301
[Bâtiment] Musée:Western Museum 2e bâtiment [Niveau] 1er étage [Salle] Salle 101 [Salle] Salle 102 [Niveau] 2e étage [Salle] Salle 201 [Niveau] 3e étage [Salle] Salle 301
[Bâtiment] Musée:Western Museum 3e bâtiment [Niveau] 1er étage [Salle] Salle 101 [Salle] Salle 102 [Niveau] 2e étage [Salle] Salle 201 [Niveau] 3e étage [Salle] Salle 301
[Bâtiment] Musée:Musée oriental 1er bâtiment [Niveau] 1er étage [Salle] Salle 101 [Niveau] 2e étage [Salle] Salle 201
[Bâtiment] Musée:Musée oriental 2e bâtiment [Niveau] 1er étage [Salle] Salle 101 [Niveau] 2e étage [Salle] Salle 201
[Bâtiment] Musée:Musée national 1er bâtiment [Niveau] 1er étage [Salle] Salle 101
[Bâtiment] Cinéma:HOGE Cinemas 1er bâtiment [Niveau] 1er étage [Salle] Salle 101

Si vous ne faites pas `` product.clone () '', vous obtiendrez le résultat suivant, qui est un constructeur inutile.

[output]
[Bâtiment] Musée:3e bâtiment du Western Museum...
[Bâtiment] Musée:3e bâtiment du Western Museum...
[Bâtiment] Musée:3e bâtiment du Western Museum...
[Bâtiment] Musée:Le deuxième bâtiment du musée oriental...
[Bâtiment] Musée:Le deuxième bâtiment du musée oriental...
[Bâtiment] Musée:Musée national 1er bâtiment...
[Bâtiment] Cinéma:Cinémas HOGE 1...

Recommended Posts

[Gang of Four] Apprentissage des modèles de conception - Constructeur
[Gang of Four] Apprentissage des modèles de conception
[Gang of Four] Apprentissage des modèles de conception --Singleton
[Gang of Four] Apprentissage des modèles de conception - Décorateur
[Gang of Four] Apprentissage des modèles de conception - Visiteur
[Gang of Four] Apprentissage des modèles de conception - Médiateur
[Gang of Four] Apprentissage des modèles de conception - Itérateur
[Gang of Four] Apprentissage des modèles de conception - Façade
[Gang of Four] Apprentissage des modèles de conception - Prototype
[Gang of Four] Apprentissage des modèles de conception --Mémento
[Gang of Four] Apprentissage des modèles de conception - État
[Gang of Four] Apprentissage des modèles de conception - Interprétation
[Gang of Four] Apprentissage des modèles de conception - Pont
[Gang of Four] Apprentissage des modèles de conception - Proxy
[Gang of Four] Apprentissage des modèles de conception - Stratégie
[Gang of Four] Apprentissage des modèles de conception - Adaptateur
[Gang of Four] Apprentissage des modèles de conception --Observer
[Gang of Four] Apprentissage des modèles de conception - Commande
[Gang of Four] Apprentissage des modèles de conception - Poids du vol
[Gang of Four] Apprentissage des modèles de conception - Usine abstraite
[Gang of Four] Apprentissage des modèles de conception - Méthode d'usine
[Gang of Four] Apprentissage des modèles de conception - Chaîne de responsabilité
[Gang of Four] Apprentissage des modèles de conception - Méthode du modèle
Modèle de conception #Builder
Apprenez le modèle de conception "Builder" avec Python
Modèles Gang of Four (GoF) en Python
Modèle de conception #Adapter
Modèle de conception #Decorator
Apprentissage de la reconnaissance de formes en vidéo Partie 1 Champ de reconnaissance de formes
Modèle de conception #Observer
Modèle de conception #Facade
Modèle de conception #Strategy
Modèle de conception #Singleton
Modèle de conception #Proxy
J'ai écrit un modèle de conception dans l'édition Kotlin Builder
Apprenez le modèle de conception «Chaîne de responsabilité» en Python
Deep learning 1 Pratique du deep learning
Design Pattern #Template, méthode
L'histoire selon laquelle les modèles de conception du GoF ne sont rien de plus qu'une «introduction de couches abstraites»