[PYTHON] Ich habe über Designmuster studiert (persönliches Memo) Teil 4 (AbstractFactory-Muster, Brückenmuster, Strategiemuster)

Einführung

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.

Vergangenes Protokoll

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

Abstraktes Fabrikmuster

  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());

Eigentlich verwenden

Gegenstand

――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())

Zusammenfassung der Builder-Muster

AbstractFactory.png

Brückenmuster

Eigentlich verwenden

Gegenstand

# -*- 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)))

Zusammenfassung der Builder-Muster

Bridge.png

Strategiemuster

――Bei normaler Programmierung kann der Algorithmus in einer Form implementiert werden, die sich in die Methode einfügt.

Eigentlich verwenden

Gegenstand

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

Zusammenfassung der Strategiemuster

Strategy.png

Recommended Posts

Ich habe über Designmuster studiert (persönliches Memo) Teil 4 (AbstractFactory-Muster, Brückenmuster, Strategiemuster)
Ich habe über Designmuster (persönliches Memo) Teil 3 (Prototypmuster, Builder-Muster) studiert.
Ich habe über Designmuster (persönliches Memo) Teil 5 (Verbundmuster, Dekorationsmuster, Besuchermuster) studiert.
Ich habe über Entwurfsmuster (persönliches Memo) Teil 8 (Proxy-Muster, Befehlsmuster, Interpreter-Muster) studiert.
Ich habe über Designmuster (persönliches Memo) Teil 7 (Beobachtermuster, Erinnerungsmuster, Zustandsmuster, Fliegengewichtsmuster) studiert.
Ich habe über Designmuster (persönliches Memo) Teil 6 (Muster der Verantwortungskette, Fassadenmuster, Vermittlermuster) studiert.
Entwurfsmuster #Strategie
Ich habe richtig über Systemd gelernt