From 283a99446bb538b6dce5e5a2ee2f38cef6780b56 Mon Sep 17 00:00:00 2001 From: Lucius Bachmann Date: Mon, 25 Mar 2024 14:44:39 +0100 Subject: [PATCH] sw_concepts: replace abstract-factory example Use self drawn stripped down version of the diagram. --- .../abstract-factory-bad-case.png | Bin 0 -> 37127 bytes .../abstract-factory-bad-case.puml | 66 ++++++++++++++++ .../abstract-factory-good-case.png | Bin 0 -> 45632 bytes .../abstract-factory-good-case.puml | 71 ++++++++++++++++++ topics/sw_concepts/sw_concept_slides.md | 37 +++++---- 5 files changed, 158 insertions(+), 16 deletions(-) create mode 100644 topics/sw_concepts/images/abstract-factory/abstract-factory-bad-case.png create mode 100644 topics/sw_concepts/images/abstract-factory/abstract-factory-bad-case.puml create mode 100644 topics/sw_concepts/images/abstract-factory/abstract-factory-good-case.png create mode 100644 topics/sw_concepts/images/abstract-factory/abstract-factory-good-case.puml diff --git a/topics/sw_concepts/images/abstract-factory/abstract-factory-bad-case.png b/topics/sw_concepts/images/abstract-factory/abstract-factory-bad-case.png new file mode 100644 index 0000000000000000000000000000000000000000..45245cf8526ad17efca47fe9736e56961664b85c GIT binary patch literal 37127 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 Ok-oN(*1i3<;r|Pia#YCx literal 0 HcmV?d00001 diff --git a/topics/sw_concepts/images/abstract-factory/abstract-factory-bad-case.puml b/topics/sw_concepts/images/abstract-factory/abstract-factory-bad-case.puml new file mode 100644 index 0000000..fae0ee4 --- /dev/null +++ b/topics/sw_concepts/images/abstract-factory/abstract-factory-bad-case.puml @@ -0,0 +1,66 @@ +@startuml + +class Bootstrap + +package views { + + class Header + + class MainView + +} + +package components { + + together { + interface Label + + class LightLabel + + class DarkLabel + } + + together { + interface Button + + class LightButton + + class DarkButton + } + + Label <|.. LightLabel + Label <|.. DarkLabel + + Button <|.. LightButton + Button <|.. DarkButton +} + +package legend <> { + <> example_diamond + + note left of example_diamond + if darkmode + endnote +} + +<> header_label + +<> main_label +<> main_button + +Bootstrap "creates" ---> Header +Bootstrap "creates" ---> MainView + +Header --> header_label +header_label --> LightLabel +header_label --> DarkLabel + +MainView --> main_label +main_label --> LightLabel +main_label --> DarkLabel + +MainView --> main_button +main_button --> LightButton +main_button --> DarkButton + +@enduml diff --git a/topics/sw_concepts/images/abstract-factory/abstract-factory-good-case.png b/topics/sw_concepts/images/abstract-factory/abstract-factory-good-case.png new file mode 100644 index 0000000000000000000000000000000000000000..75eb0ef5b31f4ea250ff9514f34c7e4641845a7a GIT binary patch literal 45632 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 G`+orXVh(Qr literal 0 HcmV?d00001 diff --git a/topics/sw_concepts/images/abstract-factory/abstract-factory-good-case.puml b/topics/sw_concepts/images/abstract-factory/abstract-factory-good-case.puml new file mode 100644 index 0000000..637a5d9 --- /dev/null +++ b/topics/sw_concepts/images/abstract-factory/abstract-factory-good-case.puml @@ -0,0 +1,71 @@ +@startuml + +class Bootstrap + +package views { + + class Header + + class MainView + +} + +package components { + + together { + interface Label + + class LightLabel + + class DarkLabel + } + + together { + interface Button + + class LightButton + + class DarkButton + } + + interface ComponentFactory + + class LightComponentFactory implements ComponentFactory + + class DarkComponentFactory implements ComponentFactory + + + Label <|.. LightLabel + Label <|.. DarkLabel + + Button <|.. LightButton + Button <|.. DarkButton + + DarkComponentFactory --> DarkLabel + DarkComponentFactory --> DarkButton + + LightComponentFactory --> LightLabel + LightComponentFactory --> LightButton +} + +package legend <> { + <> example_diamond + + note left of example_diamond + if darkmode + endnote +} + +<> create + +Bootstrap "creates" ---> create +create --> LightComponentFactory +create --> DarkComponentFactory +Bootstrap "creates" ---> Header +Bootstrap ---> MainView + +Header --> ComponentFactory + +MainView --> ComponentFactory + +@enduml diff --git a/topics/sw_concepts/sw_concept_slides.md b/topics/sw_concepts/sw_concept_slides.md index 72974c8..d7f5f10 100644 --- a/topics/sw_concepts/sw_concept_slides.md +++ b/topics/sw_concepts/sw_concept_slides.md @@ -351,28 +351,33 @@ class CasiceConfigurationFactory: AbstractFactory ------- - +* Use Case: + * Es gibt 2 oder mehr Gruppen von Komponenten. Es sollen immer nur Komponenten aus einer der Gruppen erstellt werden. + * Beispiel Light/Dark Theme: es soll entweder Light oder Dark Theme sein, aber nie gemischt. + * Die gleichen If-Statements tauchen wiederholt an unterschiedlichen Stellen im Code auf. Man möchte diese Code-Duplizierung + verhindern, indem man die If-Statements an einem zentralen Ort platziert. -AbstractFactory Beispiel 1 +von [Java Design Patterns/AbstractFactory](https://github.com/iluwatar/java-design-patterns/tree/07663ce2bdd46ca4697307068b9eb0d4c8888ead/abstract-factory/README.md) + +AbstractFactory Beispiel: vorher ------ +\colBegin{0.8} +![AbstractFactory Beispiel: vorher](images/abstract-factory/abstract-factory-bad-case.png){width=100%} +\colNext{0.2} +\colEnd -```python -class ButtonFactory: - def get_bwd_button(self, name, dim, text): - return BwdButton(name, dim, text) +AbstractFactory Beispiel: nachher +------ - def get_fwd_button(self, name, dim, text): - return FwdButton(name, dim, text) +\colBegin{0.8} +![AbstractFactory Beispiel: nachher](images/abstract-factory/abstract-factory-good-case.png){width=100%} +\colNext{0.2} +\small - def get_info_button(self, name, info_text): - return InfoButton(name, info_text) +* Die Anzahl "if darkmode" statements ist reduziert. +* Es ist jetzt viel einfacher, ein "HighContrast"-Theme einzubauen. -class ButtonFactoryC(ButtonFactory): - pass - -class ButtonFactoryL(ButtonFactory): - pass -``` +\colEnd AbstractFactory Beispiel 2 ------