From 37b9d45a7404c76e8977757f57455092a35885c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 13 Aug 2017 10:09:26 +0300 Subject: [PATCH] #590 Add explanation for Abstract Factory --- abstract-factory/README.md | 105 +++++++++++- abstract-factory/etc/abstract-factory.png | Bin 21644 -> 0 bytes abstract-factory/etc/abstract-factory.ucls | 159 ------------------ .../etc/abstract-factory.urm.puml | 89 ---------- abstract-factory/etc/abstract-factory_1.png | Bin 58331 -> 0 bytes pom.xml | 1 + 6 files changed, 102 insertions(+), 252 deletions(-) delete mode 100644 abstract-factory/etc/abstract-factory.png delete mode 100644 abstract-factory/etc/abstract-factory.ucls delete mode 100644 abstract-factory/etc/abstract-factory.urm.puml delete mode 100644 abstract-factory/etc/abstract-factory_1.png diff --git a/abstract-factory/README.md b/abstract-factory/README.md index f153c1202..c049401fc 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -18,7 +18,107 @@ Kit Provide an interface for creating families of related or dependent objects without specifying their concrete classes. -![alt text](./etc/abstract-factory_1.png "Abstract Factory") +## Explanation +Real world example + +> To create a kingdom we need objects with common theme. Elven kingdom needs an Elven king, Elven castle and Elven army whereas Orcish kingdom needs an Orcish king, Orcish castle and Orcish army. There is a dependency between the objects in the kingdom. + +In plain words + +> A factory of factories; a factory that groups the individual but related/dependent factories together without specifying their concrete classes. + +Wikipedia says + +> The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes + +**Programmatic Example** + +Translating the kingdom example above. First of all we have some interfaces and implementation for the objects in the kingdom + +``` +public interface Castle { + String getDescription(); +} +public interface King { + String getDescription(); +} +public interface Army { + String getDescription(); +} + +// Elven implementations -> +public class ElfCastle implements Castle { + static final String DESCRIPTION = "This is the Elven castle!"; + @Override + public String getDescription() { + return DESCRIPTION; + } +} +public class ElfKing implements King { + static final String DESCRIPTION = "This is the Elven king!"; + @Override + public String getDescription() { + return DESCRIPTION; + } +} +public class ElfArmy implements Army { + static final String DESCRIPTION = "This is the Elven Army!"; + @Override + public String getDescription() { + return DESCRIPTION; + } +} + +// Orcish implementations similarly... + +``` + +Then we have the abstraction and implementations for the kingdom factory + +``` +public interface KingdomFactory { + Castle createCastle(); + King createKing(); + Army createArmy(); +} + +public class ElfKingdomFactory implements KingdomFactory { + public Castle createCastle() { + return new ElfCastle(); + } + public King createKing() { + return new ElfKing(); + } + public Army createArmy() { + return new ElfArmy(); + } +} + +public class OrcKingdomFactory implements KingdomFactory { + public Castle createCastle() { + return new OrcCastle(); + } + public King createKing() { + return new OrcKing(); + } + public Army createArmy() { + return new OrcArmy(); + } +} +``` + +Now we have our abstract factory that lets us make family of related objects i.e. Elven kingdom factory creates Elven castle, king and army etc. + +``` +KingdomFactory factory = new ElfKingdomFactory(); +Castle castle = factory.createCastle(); +King king = factory.createKing(); +Army army = factory.createArmy(); + +castle.getDescription(); // Output: This is the Elven castle! +king.getDescription(); // Output: This is the Elven king! +army.getDescription(); // Output: This is the Elven Army! +``` ## Applicability Use the Abstract Factory pattern when @@ -41,9 +141,6 @@ Use the Abstract Factory pattern when * Dependency injection in java hides the service class dependencies that can lead to runtime errors that would have been caught at compile time. - - - ## Real world examples * [javax.xml.parsers.DocumentBuilderFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html) diff --git a/abstract-factory/etc/abstract-factory.png b/abstract-factory/etc/abstract-factory.png deleted file mode 100644 index c709276b662b0006412938e5b675628d48e92840..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21644 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 diff --git a/abstract-factory/etc/abstract-factory.ucls b/abstract-factory/etc/abstract-factory.ucls deleted file mode 100644 index bdf1e1510..000000000 --- a/abstract-factory/etc/abstract-factory.ucls +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/abstract-factory/etc/abstract-factory.urm.puml b/abstract-factory/etc/abstract-factory.urm.puml deleted file mode 100644 index 7b5e1b701..000000000 --- a/abstract-factory/etc/abstract-factory.urm.puml +++ /dev/null @@ -1,89 +0,0 @@ -@startuml -package com.iluwatar.abstractfactory { - class App { - - LOGGER : Logger {static} - - army : Army - - castle : Castle - - king : King - + App() - + createKingdom(factory : KingdomFactory) - + getArmy() : Army - ~ getArmy(factory : KingdomFactory) : Army - + getCastle() : Castle - ~ getCastle(factory : KingdomFactory) : Castle - + getKing() : King - ~ getKing(factory : KingdomFactory) : King - + main(args : String[]) {static} - - setArmy(army : Army) - - setCastle(castle : Castle) - - setKing(king : King) - } - interface Army { - + getDescription() : String {abstract} - } - interface Castle { - + getDescription() : String {abstract} - } - class ElfArmy { - ~ DESCRIPTION : String {static} - + ElfArmy() - + getDescription() : String - } - class ElfCastle { - ~ DESCRIPTION : String {static} - + ElfCastle() - + getDescription() : String - } - class ElfKing { - ~ DESCRIPTION : String {static} - + ElfKing() - + getDescription() : String - } - class ElfKingdomFactory { - + ElfKingdomFactory() - + createArmy() : Army - + createCastle() : Castle - + createKing() : King - } - interface King { - + getDescription() : String {abstract} - } - interface KingdomFactory { - + createArmy() : Army {abstract} - + createCastle() : Castle {abstract} - + createKing() : King {abstract} - } - class OrcArmy { - ~ DESCRIPTION : String {static} - + OrcArmy() - + getDescription() : String - } - class OrcCastle { - ~ DESCRIPTION : String {static} - + OrcCastle() - + getDescription() : String - } - class OrcKing { - ~ DESCRIPTION : String {static} - + OrcKing() - + getDescription() : String - } - class OrcKingdomFactory { - + OrcKingdomFactory() - + createArmy() : Army - + createCastle() : Castle - + createKing() : King - } -} -App --> "-castle" Castle -App --> "-king" King -App --> "-army" Army -ElfArmy ..|> Army -ElfCastle ..|> Castle -ElfKing ..|> King -ElfKingdomFactory ..|> KingdomFactory -OrcArmy ..|> Army -OrcCastle ..|> Castle -OrcKing ..|> King -OrcKingdomFactory ..|> KingdomFactory -@enduml \ No newline at end of file diff --git a/abstract-factory/etc/abstract-factory_1.png b/abstract-factory/etc/abstract-factory_1.png deleted file mode 100644 index 5990edd831264f2084ee888ddba7447707622726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58331 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 Du-~w* diff --git a/pom.xml b/pom.xml index 7f96043f5..79bb7e533 100644 --- a/pom.xml +++ b/pom.xml @@ -462,6 +462,7 @@ java-design-patterns singleton factory-method + abstract-factory