Abstrakt fabriksmønster i Java

1. Oversigt

I denne artikel vil vi diskutere det abstrakte fabriks designmønster.

Bogen Design Patterns: Elements of Reusable Object-Oriented Software siger, at en abstrakt fabrik “Giver en grænseflade til oprettelse af familier af relaterede eller afhængige objekter uden at specificere deres konkrete klasser”. Med andre ord giver denne model os mulighed for at skabe objekter, der følger et generelt mønster.

Et eksempel på det abstrakte fabriks designmønster i JDK er newInstance () af javax.xml.parsers.DocumentBuilderFactory klasse.

2. Abstrakt fabriksdesignmønstereksempel

I dette eksempel opretter vi to implementeringer af Factory Method Design-mønsteret: AnimalFactory og FarveFabrik.

Derefter administrerer vi adgang til dem ved hjælp af en abstrakt fabrik AbstraktFabrik:

Først opretter vi en familie af Dyr klasse og vil senere bruge det i vores abstrakte fabrik.

Her er den Dyr grænseflade:

offentlig grænseflade Animal {String getAnimal (); String makeSound (); }

og en konkret implementering And:

offentlig klasse Duck implementerer Animal {@Override public String getAnimal () {returner "Duck"; } @ Override public String makeSound () {returner "Squeks"; }} 

Desuden kan vi skabe mere konkrete implementeringer af Dyr interface (som Hund, bjørn, osv.) nøjagtigt på denne måde.

The Abstract Factory beskæftiger sig med familier af afhængige objekter. Med det i tankerne introducerer vi endnu en familie Farve som en grænseflade med et par implementeringer (Hvid, brun, ...).

Vi springer den aktuelle kode over for nu, men den kan findes her.

Nu hvor vi har flere familier klar, kan vi oprette en AbstraktFabrik interface til dem:

offentlig grænseflade AbstractFactory {T create (String animalType); }

Dernæst implementerer vi en AnimalFactory ved hjælp af Design Method-mønsteret, som vi diskuterede i det foregående afsnit:

offentlig klasse AnimalFactory implementerer AbstractFactory {@Override public Animal create (String animalType) {if ("Dog" .equalsIgnoreCase (animalType)) {return new Dog (); } ellers hvis ("Duck" .equalsIgnoreCase (animalType)) {returner ny Duck (); } returnere null; }} 

På samme måde kan vi implementere en fabrik til Farve interface ved hjælp af det samme designmønster.

Når alt dette er indstillet, opretter vi en Fabriksudbyder klasse, der giver os en implementering af AnimalFactory eller ColorFactory afhængigt af det argument, vi leverer til getFactory () metode:

public class FactoryProvider {public static AbstractFactory getFactory (String choice) {if ("Animal" .equalsIgnoreCase (choice)) {returner ny AnimalFactory (); } ellers hvis ("Color" .equalsIgnoreCase (valg)) {returner ny ColorFactory (); } returnere null; }}

3. Hvornår skal man bruge abstrakt fabriksmønster:

  • Klienten er uafhængig af, hvordan vi opretter og komponerer objekterne i systemet
  • Systemet består af flere familier af objekter, og disse familier er designet til at blive brugt sammen
  • Vi har brug for en kørselsværdi for at konstruere en bestemt afhængighed

Mens mønsteret er fantastisk, når du opretter foruddefinerede objekter, kan det være en udfordring at tilføje de nye. For at understøtte den nye type objekter skal du ændre AbstraktFabrik klasse og alle dens underklasser.

4. Resume

I denne artikel lærte vi om abstrakt fabriksmønster.

Endelig, som altid, kan implementeringen af ​​disse eksempler findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found