** 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) **?
Indem der Erstellungsprozess eines zusammengesetzten Objekts vom Ausdrucksformat unabhängig gemacht wird, können Objekte mit unterschiedlichen Ausdrucksformaten im selben Erstellungsprozess generiert werden.
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
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)
}
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.
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"
}
}
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.
[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