Dieser Artikel ist ein persönliches Studienmemo. Ich schreibe einen Artikel, der von der Besessenheit getrieben ist, dass das, was ich eingebe, ausgegeben werden muss. Ich schreibe diesen Artikel über Qiita in der Hoffnung, dass jemand, der damit vertraut ist, auf Fehler hinweisen und Ratschläge geben kann.
Ich lebe ein Berufsleben als Ingenieur, aber ich habe nicht richtig über Entwurfsmuster gelernt, also habe ich versucht zu studieren.
Was ist hier beschrieben https://github.com/ck-fm0211/notes_desigh_pattern Ich lade auf.
Ich habe über Entwurfsmuster (persönliches Memo) Teil 1 studiert Ich habe über Entwurfsmuster (persönliches Memo) Teil 2 studiert Ich habe über Entwurfsmuster (persönliches Memo) Teil 3 studiert
  car.add_tire(CarTire());
  car.add_handle(CarHandle());
―― Es kann vorkommen, dass ein anderer Reifen (Fahrradreifen) aufgrund eines Fehlers des Programmierers übergeben wird.
  car.add_tire(BicycleTire());
  car.add_handle(CarHandle());
――Denken Sie daran, einen "Topf" zu machen
# -*- coding:utf-8 -*-
class HotPot:
    pot = None
    soup = None
    protein = None
    vegetables = []
    other_ingredients = []
    @staticmethod
    def hot_pot(pot):
        HotPot.pot = pot
    @staticmethod
    def add_soup(soup):
        HotPot.soup = soup
    @staticmethod
    def add_main(protein):
        HotPot.protein = protein
    @staticmethod
    def add_vegitables(vegitables):
        HotPot.vegetables = vegitables
    @staticmethod
    def add_other_ingredients(other_ingredients):
        HotPot.other_ingredients = other_ingredients
class Factory(metaclass=ABCMeta):
    @abstractmethod
    def get_soup(self):
        pass
    @abstractmethod
    def get_main(self):
        pass
    @abstractmethod
    def get_vegetables(self):
        pass
    @abstractmethod
    def get_other_ingredients(self):
        pass
class MizutakiFactory(Factory):
    def get_soup(self):
        return "torigara"
    def get_main(self):
        return "chicken"
    def get_vegetables(self):
        return ["hakusai", "ninjin", "negi"]
    def get_other_ingredients(self):
        return ["tofu"]
class Sample:
    @staticmethod
    def main():
        hp = HotPot()
        mf = MizutakiFactory()
        hp.add_soup(mf.get_main())
        hp.add_main(mf.get_main())
        hp.add_vegitables(mf.get_vegetables())
        hp.add_other_ingredients(mf.get_other_ingredients())
--Wählen Sie die Factory-Klasse aus, die tatsächlich verwendet werden soll, und generieren Sie sie gemäß der im Argument angegebenen Zeichenfolge
class Sample:
    @staticmethod
    def create_factory(s):
        if s == "Kimchi Hot Pot":
            return KimuchiFactory()
        elif s == "Sukiyaki":
            return SukiyakiFactory()
        else:
            return MizutakiFactory()
    @staticmethod
    def main(arg):
        hp = HotPot()
        fc = create_factory(arg)
        hp.add_soup(fc.get_main())
        hp.add_main(fc.get_main())
        hp.add_vegitables(fc.get_vegetables())
        hp.add_other_ingredients(fc.get_other_ingredients())

# -*- coding:utf-8 -*-
from abc import ABCMeta, abstractmethod
class Sorter(metaclass=ABCMeta)
    @abstractmethod
    def sort(self, obj):
        pass
class QuickSorter(Sorter):
    def sort(self, obj):
        #Schnelle Sorte
        pass
class BubbleSorter(Sorter):
    def sort(self, obj):
        #Blasensorte
        pass
from datetime import datetime
class TimerSorter(metaclass=ABCMeta, Sorter):
    @abstractmethod
    def time_sorter(self, obj):
        start = datetime.now()
        Sorter.sort(obj)
        end = datetime.now()
        print("time:" + str((end - start)))
class SortImple(metaclass=ABCMeta):
    @abstractmethod
    def sort(self, obj):
        pass
class Sorter:
    si = SortImple()
    @staticmethod
    def sorter(si):
        Sorter.si = si
    def sort(self, obj):
        Sorter.si.sort(obj)
class QuickSorterImple(SortImple):
    def sort(self, obj):
        #Schnelle Sorte
        pass
class BubbleSorterImple(SortImple):
    def sort(self, obj):
        #Blasensorte
        pass
from datetime import datetime
class TimerSorter(metaclass=ABCMeta, Sorter):
    def __init__(self, sort_impl):
        super(sort_impl)
    @abstractmethod
    def time_sorter(self, obj):
        start = datetime.now()
        Sorter.sort(obj)
        end = datetime.now()
        print("time:" + str((end - start)))

――Bei normaler Programmierung kann der Algorithmus in einer Form implementiert werden, die sich in die Methode einfügt.
――Es gibt viele Fälle, in denen Sie den Algorithmus je nach Situation ändern müssen. Beispielsweise wird in einem Spielprogramm der Strategiealgorithmus abhängig vom Schwierigkeitsgrad geändert. ――Hier wollen wir uns einen Algorithmus überlegen, der einen einfachen Vergleich zwischen groß und klein ermöglicht.
# -*- coding:utf-8 -*-
from abc import ABCMeta, abstractmethod
class Human:
    def __init__(self, name, height, weight, age):
        self.name = name
        self.height = height
        self.weight = weight
        self.age = age
class SampleClass:
    @staticmethod
    def compare(h1: Human, h2: Human) -> int:
        if h1.age > h2.age:
            return 1
        elif h1.age == h2.age:
            return 0
        else:
            return -1
class SampleClass2:
    type = -1
    COMPARE_AGE = 1
    COMPARE_HEIGHT = 2
    COMPARE_WEIGHT = 3
    def __init__(self, type):
        SampleClass2.type = type
    @staticmethod
    def compare(h1: Human, h2: Human) -> int:
        if SampleClass2.type == SampleClass2.COMPARE_AGE:
            if h1.age > h2.age:
                return 1
            elif h1.age == h2.age:
                return 0
            else:
                return -1
        elif SampleClass2.type == SampleClass2.COMPARE_HEIGHT:
            if h1.height > h2.height:
                return 1
            elif h1.height == h2.height:
                return 0
            else:
                return -1
        #・ ・ ・
――Es wird komplizierter Code. Im Strategiemuster wird der Teil des Algorithmus, der je nach Situation geändert werden muss, bewusst als separate Klasse getrennt, um die Aussicht auf Änderung oder Hinzufügung des Algorithmus zu verbessern.
class AgeComparator:
    @staticmethod
    def compare(h1: Human, h2: Human) -> int:
        if h1.age > h2.age:
            return 1
        elif h1.age == h2.age:
            return 0
        else:
            return -1
class MyClass:
    @staticmethod
    def compare(h1: Human, h2: Human) -> int:
        return AgeComparator.compare(h1, h2)
――Das allein hat keinen Wert und ist kein Strategiemuster. Das Strategiemuster erfordert, dass separate Algorithmus-Teile eine gemeinsame Schnittstelle haben.
class Comparator(metaclass=ABCMeta):
    @staticmethod
    @abstractmethod
    def compare(h1: Human, h2: Human) -> int:
        pass
class AgeComparator(Comparator):
    @staticmethod
    def compare(h1: Human, h2: Human) -> int:
        if h1.age > h2.age:
            return 1
        elif h1.age == h2.age:
            return 0
        else:
            return -1
class HeightComparator(Comparator):
    @staticmethod
    def compare(h1: Human, h2: Human) -> int:
        if h1.height > h2.height:
            return 1
        elif h1.height == h2.height:
            return 0
        else:
            return -1
class SampleClass:
    def __init__(self, comp: Comparator):
        self._comp = comp
    def compare(self, h1: Human, h2: Human) -> int:
        return self._comp.compare(h1, h2)

Recommended Posts