From f7297924cbd716ba379a7bc295e0b2d6b2924957 Mon Sep 17 00:00:00 2001 From: Lucius Bachmann Date: Mon, 25 Mar 2024 12:50:54 +0100 Subject: [PATCH 1/2] sw_concepts: rename dir (button_,abstract-)factory That we can add other abstract factory examples. --- .../footer_c.png | Bin .../footer_m.png | Bin topics/sw_concepts/sw_concept_slides.md | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename topics/sw_concepts/images/{button_factory => abstract-factory}/footer_c.png (100%) rename topics/sw_concepts/images/{button_factory => abstract-factory}/footer_m.png (100%) diff --git a/topics/sw_concepts/images/button_factory/footer_c.png b/topics/sw_concepts/images/abstract-factory/footer_c.png similarity index 100% rename from topics/sw_concepts/images/button_factory/footer_c.png rename to topics/sw_concepts/images/abstract-factory/footer_c.png diff --git a/topics/sw_concepts/images/button_factory/footer_m.png b/topics/sw_concepts/images/abstract-factory/footer_m.png similarity index 100% rename from topics/sw_concepts/images/button_factory/footer_m.png rename to topics/sw_concepts/images/abstract-factory/footer_m.png diff --git a/topics/sw_concepts/sw_concept_slides.md b/topics/sw_concepts/sw_concept_slides.md index 2f1bf66..72974c8 100644 --- a/topics/sw_concepts/sw_concept_slides.md +++ b/topics/sw_concepts/sw_concept_slides.md @@ -377,8 +377,8 @@ class ButtonFactoryL(ButtonFactory): AbstractFactory Beispiel 2 ------ -![footer_m](images/button_factory/footer_m.png) -![footer_c](images/button_factory/footer_c.png) +![footer_m](images/abstract-factory/footer_m.png) +![footer_c](images/abstract-factory/footer_c.png) Strategy ------- From 11362d8f0ff715225cfee69dce8b6904b0f2e44c Mon Sep 17 00:00:00 2001 From: Lucius Bachmann Date: Mon, 25 Mar 2024 14:44:39 +0100 Subject: [PATCH 2/2] sw_concepts: replace abstract-factory example Use self drawn stripped down version of the diagram. --- .../abstract-factory-bad-case.png | Bin 0 -> 38876 bytes .../abstract-factory-bad-case.puml | 66 ++++++++++++++++ .../abstract-factory-good-case.png | Bin 0 -> 48893 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..eed1c351e03578c3ba3235202cd7b4b474f3c9bf GIT binary patch literal 38876 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 { + <> 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..6b0fd18b3236f44955cd22644a8aa3e5f4607fdf GIT binary patch literal 48893 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%0AaWh8fYqJH1)8F?spbpU$IO|>*)M3Ck|j5sD{ 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

>7zFQ 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 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 ------