** 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) **?
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.
-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
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
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)
}
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.
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"
}
}
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.
[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