I. Wzorce kreacyjne
1. Singleton
2. Budowniczy
3. Prototyp
4. Fabryka
5. Fabryka abstrakcyjna
II. Wzorce strukturalne
1. Adapter
2. Most
3. Kompozyt
4. Dekorator
5. Fasada
6. Pyłek
7. Pełnomocnik
III. Wzorce czynnościowe
1. Łańcuch zobowiązań
2. Polecenie
3. Interpreter
4. Iterator
5. Mediator
6. Pamiątka
7. Obserwator
8. Stan
9. Strategia
10. Metoda szablonowa
11. Odwiedzający

Fabryka - Metoda wytwórcza - wzorzec projektowy - java

1. Cel:
Wzorzec projektowy Fabryka odpowiada za tworzenie instancji oraz zarządzanie ich cyklem życia podczas ich tworzenia.
Odnosi się do klas o wspólnym interface-e lub podklasy.

2. Problem:
Chcemy tworzyć obiekt bez ujawniania logiki tworzenia i odwołać się do nowo utworzonego obiektu za pomocą wspólnego interfejsu

3. Rozwiązanie:
Fabryka tworzy konkretne klasy, przez sparametryzowane ich tworzenie.

4. Diagram klas wzorca Fabryka:


5. Implementacja:
Pierwszą rzeczą jest stworzenie inteface-u lub podklasy fabryki.
  1. package pl.edu.java.designpatterns.factory;
  2.  
  3. public interface Lody {
  4.         String getNazwa();
  5.         double getCena;
  6.         int getKalorie();
  7. }
Następnie implementacja konkretnej klasy.
  1. package pl.edu.java.designpatterns.factory;
  2.  
  3. public class TruskawkoweLody implements Lody {
  4.         private String nazwa;
  5.         private double cena;
  6.         private kalorie;
  7.     public TruskawkoweLody(double cena, int kalorie) {
  8.                 this.nazwa = "Lody Truskawkowe";
  9.                 this.cena = cena;
  10.                 this.kalorie = kalorie;
  11.     }
  12.        
  13.         public String getNazwa() {
  14.                 return nazwa;
  15.         }
  16.        
  17.         public double getCena() {
  18.                 return cena;
  19.         }
  20.        
  21.         public int getKalorie() {
  22.                 return kalorie;
  23.         }
  24. }

  1. package pl.edu.java.designpatterns.factory;
  2.  
  3. public class CzekoladoweLody implements Lody {
  4.         private String nazwa;
  5.         private double cena;
  6.         private kalorie;
  7.     public TruskawkoweLody(double cena, int kalorie) {
  8.                 this.nazwa = "Lody czekoladowe";
  9.                 this.cena = cena;
  10.                 this.kalorie = kalorie;
  11.     }
  12.        
  13.         public String getNazwa() {
  14.                 return nazwa;
  15.         }
  16.        
  17.         public double getCena() {
  18.                 return cena;
  19.         }
  20.        
  21.         public int getKalorie() {
  22.                 return kalorie;
  23.         }
  24. }
Oraz implementacji konkretnej fabryki:
  1. package pl.edu.java.designpatterns.factory;
  2.  
  3. public class FactoryLody {
  4.         private FactoryLody() {}
  5.         public static Lody getLody(String typLody) {
  6.                 switch (typLody) {
  7.                         case "Truskawkowe":
  8.                                 return new TruskawkoweLody(4.99, 700);
  9.                         case "Czekoladowe":
  10.                                 return new CzekoladoweLody(3.99, 900);
  11.                         default:
  12.                                 return null;
  13.                 }
  14.         }      
  15. }
  16.  
Zastosowanie fabryki w klasie klienta.
  1. packge pl.edu.java.designpatterns.factory;
  2.  
  3. public class LodyTest {
  4.         Lody truskawkowe = FactoryLody.getLody("Truskawkowe");
  5.        System.out.println(truskawkowe.getNazwa());
  6. }

Czasami chcemy aby argumentem metody fabryki pobierajacej nowy element był parametr String.
Ale dobrym zwyczajem jest użyć enum do wybrania określonego elementu
  1. package pl.edu.java.designpatterns.factory;
  2. public class FactoryLody {
  3.         public enum LodyTyp {
  4.                 TRUSKAWKOWE, CZEKOLADOWE;
  5.         }
  6.        
  7.         private FactoryLody() {}
  8.         public static Lody getLody(LodyTyp typLody) {
  9.                 switch (typLody) {
  10.                         case TRUSKAWKOWE:
  11.                                 return new TruskawkoweLody(4.99, 700);
  12.                         case CZEKOLADOWE:
  13.                                 return new CzekoladoweLody(3.99, 900);
  14.                         default:
  15.                                 return null;
  16.                 }
  17.         }      
  18. }
Zastosowanie fabryki z typem enum w klasie klienta.
  1. package pl.edu.java.designpatterns.factory;
  2.  
  3. public class LodyTest {
  4.     public static void main(String[] args) {
  5.         Lody truskawkowe = FactoryLody.getLody(FactoryLody.LodyTyp.TRUSKAWKOWE);
  6.         System.out.println(truskawkowe.getNazwa());
  7.     }
  8. }
6. Zastosowanie w kodzie java:

getInstance() używa jest do tworzenia wzorca fabryki, to nie jest singleton:
- java.util.Calendar
- ResourceBundle
- NumberFormat
created by cv.java.org.pl © 2023 All Rights Reserved.