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

Fasada (facade) - wzorzec projektowy (design pattern) - java

1. Cel:
Wzorzec fasada (facade) zapewnia uproszczony interfejs dla złożonego lub trudnego w użyciu systemu,
który często jest wynikiem źle zaprojektowanego interfejsu API. Jest to wzorzec służący do refaktoryzacji kodu.
Upraszcza interface klienta.

2. Problem:
Chcemy umożliwić użycie API w łatwiejszy sposób, ukrywając szczególy dla klienta.
Przykładem może być gdy jesteśmy w pokoju i mamy kilka pilotów np. TV, Video itp.

3. Rozwiązanie:
Tworzymy jedną klasę fasadę która odpowiada za wszystkie zadania.
Udostępniamy interface fasadę która odpowiada za sterowanie wszystkimi pilotmi (podsystemami) w jednym miejscu.
Uproszczamy system i tworzymy jeden inteface dla grupy klas.

4. Diagram klas wzorca Fasada (facade):


5. Implementacja:
Pierwszą klasą jest klasa singleton, klasa służąca do nawiązania połączenia z bazą:
  1. public class DbSingleton {
  2.     private static DbSingleton instance = null;
  3.  
  4.     private DbSingleton() {
  5.     }
  6.  
  7.     public static DbSingleton getInstance() {
  8.         if (instance == null) {
  9.             instance = new DbSingleton();
  10.         }
  11.         return instance;
  12.     }
  13.  
  14.     public Connection getConnection() {
  15.         try {
  16.             DriverManager.registerDriver(new org.apache.derby.jdbc.EmbeddedDriver());
  17.             String dbUrl = "jdbc:derby:memory:testJava/testdb;create=true";
  18.             return DriverManager.getConnection(dbUrl);
  19.         } catch (Exception e) {
  20.             e.printStackTrace();
  21.             return null;
  22.         }
  23.     }
  24. }
  25.  
Druga klasa to klasa pomocnicza która odwozuje zapytanie na objekct java.
  1. public class Address {
  2.     private int id;
  3.     private String street;
  4.     private String city;
  5.  
  6.     public int getId() {
  7.         return id;
  8.     }
  9.  
  10.     public void setId(int id) {
  11.         this.id = id;
  12.     }
  13.  
  14.     public String getStreet() {
  15.         return street;
  16.     }
  17.  
  18.     public void setStreet(String street) {
  19.         this.street = street;
  20.     }
  21.  
  22.     public String getCity() {
  23.         return city;
  24.     }
  25.  
  26.     public void setCity(String city) {
  27.         this.city = city;
  28.     }
  29. }
i następnie nasza fasada:
  1. public class JdbcFacade {
  2.     private DbSingleton dbSingleton = null;
  3.  
  4.     public JdbcFacade() {
  5.         dbSingleton = DbSingleton.getInstance();
  6.     }
  7.  
  8.     public int createTable() {
  9.         int count = 0;
  10.         try {
  11.             Connection connection = dbSingleton.getConnection();
  12.             Statement statement = connection.createStatement();
  13.             count = statement.executeUpdate("CREATE TABLE ADDRESS (ID INTEGER, STREET_NAME VARCHAR(20), CITY VARCHAR(20) )");
  14.             statement.close();
  15.             connection.close();
  16.         } catch (SQLException e) {
  17.             e.printStackTrace();
  18.         }
  19.         return count;
  20.     }
  21.  
  22.     public int insertIntoTable() {
  23.         int count = 0;
  24.         try {
  25.             Connection connection = dbSingleton.getConnection();
  26.             Statement statement = connection.createStatement();
  27.             count = statement.executeUpdate(
  28. "INSERT INTO ADDRESS(ID, STREET_NAME, CITY) VALUES(1, '52.street', 'Ankara')");
  29.             statement.close();
  30.             connection.close();
  31.         } catch (SQLException e) {
  32.             e.printStackTrace();
  33.         }
  34.         return count;
  35.     }
  36.  
  37.     public List<Address> getAddresses() {
  38.         List<Address> addresses = new ArrayList<>();
  39.         try {
  40.             Connection connection = dbSingleton.getConnection();
  41.             Statement statement = connection.createStatement();
  42.             ResultSet resultSet = statement.executeQuery("SELECT * FROM ADDRESS");
  43.             while (resultSet.next()) {
  44.                 Address address = new Address();
  45.                 address.setId(resultSet.getInt(1));
  46.                 address.setStreet(resultSet.getString(2));
  47.                 address.setCity(resultSet.getString(3));
  48.                 addresses.add(address);
  49.             }
  50.             statement.close();
  51.             connection.close();
  52.         } catch (SQLException e) {
  53.             e.printStackTrace();
  54.         }
  55.         return addresses;
  56.     }
  57. }
  58.  
Oraz klasa używająca intarface-u fasady:
  1. public class FacadeTest  {
  2.        
  3.     public static void main(String args[]) {
  4.         JdbcFacade jdbcFacade = new JdbcFacade();
  5.  
  6.         jdbcFacade.createTable();
  7.         System.out.println("table created");
  8.  
  9.         int count = jdbcFacade.insertIntoTable();
  10.         System.out.println(count + " rows inserted");
  11.  
  12.         List<Address> addressList = jdbcFacade.getAddresses();
  13.         for (Address address : addressList) {
  14.             System.out.println(address.getId()
  15.             + ", " + address.getStreet()
  16.             + ", " + address.getCity());
  17.         }
  18.    }
  19. }
  20.  
6. Zastosowanie w kodzie java:
- java.net.URL używa openStream() ukrywając wywołane detale
- javax.faces.context.FacesContext używa LifeCycle, ViewHandler, NavigationHandler
- javax.faces.context.ExternalContext używa ServletContext, HttpSession, HttpServletRequest, HttpServletResponse i innych.
created by cv.java.org.pl © 2023 All Rights Reserved.