Python :: Aufgabe #286
1 Lösung
Zoo mittels einer Factory-Methode
Fortgeschrittener - Python
von Exception
- 12.09.2020 um 16:36 Uhr
Hallo zusammen,
heute erzeugen wir einen Zoo!
Erzeugt hierfür eine Basisklasse (oder Interface) "Animal" und einige Klassen die davon erben (z.B. "Lion", "Penguin", "Crocodile", "Snake").
Als nächsten Schritt wollen wir nun eine Factory-Klasse erzeugen, die sich am "Factory-Method-Pattern" orientiert.
In dieser Klasse soll eine Methode "createAnimal" existieren, die ein "Animal" zurückgibt.
Welches "Animal" zurückgegeben wird überlassen wir vorerst dem reinen Zufall ;)
Daher kann diese Klasse auch "RandomAnimalFactory" genannt werden.
Lasst nun 200 "Animals" in den Zoo einziehen.
Wie ist die Verteilung der "Animals" einer jeden Spezies in unserem Zoo?
Es kann mit der zufälligen Erzeugung zu einem gewissen Ungleichgewicht kommen.
So fühlt sich ein einzelner Pinguin gegen 199 Löwen sicher etwas in der Unterzahl ...
Erstellt nun eine zweite Factory-Klasse "BalancedAnimalFactory".
Diese soll ebenfalls die Methode "createAnimal" enthalten.
(Macht es nun evtl. Sinn sich auch bei den Factory-Klassen über ein Interface gedanken zu machen?)
Diese Factory soll nicht mehr komplett zufällig Tiere erzeugen sondern etwas ausgeglichener.
Die dort vorhandene "createAnimal" Methode soll wie folgt funktionieren:
Angenommen wir haben vier Tier-Klassen ("Lion", "Penguin", "Crocodile", "Snake").
Wird nun ein "Lion" erzeugt, so wird für die nächsten beiden Erzeugungen kein "Lion" mehr erzeugt.
Lasst nun erneut 200 "Animals" einziehen - vielleicht in einen zweiten "Parkabschnitt" (Array)? :)
Muss sich der Pinguin noch immer Sorgen machen?
Viel Spaß!
heute erzeugen wir einen Zoo!
Erzeugt hierfür eine Basisklasse (oder Interface) "Animal" und einige Klassen die davon erben (z.B. "Lion", "Penguin", "Crocodile", "Snake").
Als nächsten Schritt wollen wir nun eine Factory-Klasse erzeugen, die sich am "Factory-Method-Pattern" orientiert.
In dieser Klasse soll eine Methode "createAnimal" existieren, die ein "Animal" zurückgibt.
Welches "Animal" zurückgegeben wird überlassen wir vorerst dem reinen Zufall ;)
Daher kann diese Klasse auch "RandomAnimalFactory" genannt werden.
Lasst nun 200 "Animals" in den Zoo einziehen.
Wie ist die Verteilung der "Animals" einer jeden Spezies in unserem Zoo?
Es kann mit der zufälligen Erzeugung zu einem gewissen Ungleichgewicht kommen.
So fühlt sich ein einzelner Pinguin gegen 199 Löwen sicher etwas in der Unterzahl ...
Erstellt nun eine zweite Factory-Klasse "BalancedAnimalFactory".
Diese soll ebenfalls die Methode "createAnimal" enthalten.
(Macht es nun evtl. Sinn sich auch bei den Factory-Klassen über ein Interface gedanken zu machen?)
Diese Factory soll nicht mehr komplett zufällig Tiere erzeugen sondern etwas ausgeglichener.
Die dort vorhandene "createAnimal" Methode soll wie folgt funktionieren:
Angenommen wir haben vier Tier-Klassen ("Lion", "Penguin", "Crocodile", "Snake").
Wird nun ein "Lion" erzeugt, so wird für die nächsten beiden Erzeugungen kein "Lion" mehr erzeugt.
Lasst nun erneut 200 "Animals" einziehen - vielleicht in einen zweiten "Parkabschnitt" (Array)? :)
Muss sich der Pinguin noch immer Sorgen machen?
Viel Spaß!
Lösungen:
Python-Code
import random as rnd class Animal: def __str__(self): return self.name def __repr__(self): return self.name class Lion(Animal): def __init__(self): self.name = 'Löwe' class Penguin(Animal): def __init__(self): self.name = 'Pinguin' class Crocodile(Animal): def __init__(self): self.name = 'Krokodil' class Snake(Animal): def __init__(self): self.name = 'Schlange' class Zoo: def __init__(self, name): self.content = [] self.name = name def add_animals(self, number, method): for index in range (number): self.content.append(self._create_animal(method)()) def _create_animal(self, method): if method == 'Zufall': return self._choose_random() if method == 'Ausgeglichen': return self._choose_balanced() else: raise ValueError('Unzulässige Methode zur Auswahl des Tieres') def _choose_random(self): return rnd.choice([Lion, Penguin, Crocodile, Snake]) def _choose_balanced(self): while True: choice = self._choose_random() if not self.content: return choice elif len(self.content) == 1 and not isinstance(self.content[-1], choice): return choice elif len(self.content) > 1 and not isinstance(self.content[-2], choice) and not isinstance(self.content[-1], choice): return choice def _count_content(self): content_dict = {'Löwe': 0, 'Pinguin': 0, 'Krokodil': 0, 'Schlange': 0} for animal in self.content: content_dict[animal.name] += 1 content_string = f'{content_dict["Löwe"]} Löwen, ' + \ f'{content_dict["Pinguin"]} {"Pinguinen, " if content_dict["Pinguin"] != 1 else "Pinguin, "}' + \ f'{content_dict["Krokodil"]} {"Krokodilen und " if content_dict["Krokodil"] != 1 else "Krokodil und "}' + \ f'{content_dict["Schlange"]} {"Schlangen." if content_dict["Schlange"] != 1 else "Schlange."}' return content_string def __str__(self): return f'Der Zoo "{self.name}" besteht aus {self._count_content()}' z1 = Zoo('Wilder Zoo') z2 = Zoo('Geordneter Zoo') z1.add_animals(200, 'Zufall') z2.add_animals(200, 'Ausgeglichen') print(z1) print(z2)