Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

Možné řešení z minulého cvičení

Teorie

Vzor Abstract Factory

Problém

Program potřebuje pracovat se sadou souvisejících objektů. Těchto sad může být v programu použito více, ale stále mají stejné opakující se prvky.

Řešení

Vzor abstract factory navrhuje vyčlenit abstraktní faktory třídu, která je předkem pro konkrétní faktory. Tato faktory zajišťuje získání instancí konkrétní sady objektů.

Vzor Factory Method

Problém

Potřebujeme skrýt mechanismus vytváření instance nebo přesně není programu zřejmé jakou implementaci pro vytvoření instance použít.

Řešení

Pro vytvoření instance bude existovat rozhraní s definovanou metodou pro vytvoření instance objektu. Vlastní implementace přípravy instance je pak skryta v metodě pro vytváření a nezatěžuje detaily vlastní kód, který instanci potřebuje.

Vzor Singleton

Problém

Program potřebuje mít u některých tříd zaručeno, že nevznikne více než 1 instance dané třídy.

Řešení

Vzor singleton navrhuje neumožnit vytvářet instance pomocí new, ale mít připravenou metodu pro předání instance, která kontroluje, zda již instance existuje. Pokud ano, nevytváří novou instanci, ale pouze předá referenci na již existující instanci.

Dependency injection

Jedná se o způsob jak vytváření instanci delegovat na kontejner. Tzn. vlastní kód programu se nezabývá vytvořením objektu, ale prostřednictvím anotace nebo konfigurace žádá externí kontejner o vytvoření instance a vložení reference do objektů. V příkladu bude použito pro dependence injection frameworku Spring Boot.

Příklady k řešení

Cvičení 7 je zaměřeno na praktické využití návrhových vzorů pro vytváření objektů Abstract Factory, Factory Method, Singleton. Dále je ve cvičení 7 příklad na Spring Boot a praktické použití dependency injection.

Základem cvičení 7 je model banky, která poskytuje běžné účty a půjčky. Systém je již z části naprogramovaný a funkční pro jednu banku (v příkladu Uni banka). Úkolem bude implementovat do systému novou banku (Ab banka), která poskytuje stejné produkty, ale s mírně odlišnými podmínkami.

Stáhněte si z repository základ cvičení 7:

https://gitlab.fel.cvut.cz/B181_B6B36OMO/seminar/tree/master/cv7_assignment

Implementace ve cvičení 7 bude v následujících krocích

1) Vzor abstract factory a factory method

Implementace tříd pro novou banku - v package cz.cvut.fel.omo.cv7.ab implementujte třídy AbBankFactory - konkrétní třídu odvozenou z AbstractBankFactory, AbBankOffice, AbAccount, AbLoan - konkrétní produkty, které implementují interface BankOfffice, Account a Loan.

Při implementaci splňte následující požadavky:

  • Adresa banky je Ab Banka, Náměstí 2, Praha 1, telefonní spojení 420-2-777-777-777.
  • Měsíční poplatek za vedení účtu (AbAccount) se počítá z počtu vyběrů z účtu (0.5 EUR za jeden výběr) a od této částky se odečítá 0.25 EUR za každé vložení na účet: 0.5 * počet výběrů - 0.25 * počet vkladů.
  • Metoda toString vrací stav účtu v následujícím formátu “Ab Account - balance: %s, fee: %s”.
  • Metoda pro založení půjčky (AbLoan) má parametry částku, počet měsíců splácení, úrokovou sazbu - měsíční platba se počítá podle následujícího vzorce: částka / počet měsíců + částka * úroková sazba /12 + fixní částka 10 EUR za vedení účtu.
  • v průběhu implementace zároveň připravte testovací třídu AbBankFactoryTest.
  • doplnte implmentaci main metody, aby pracovala kromě třídy UniBankFactory také s třídou AbBankFactory.
  • jako inspiraci lze použít již implementované třídy Uni banky.

2) Vzor Singleton

Upravte implementaci UniBankFactory a AbBankFaktory, aby splňovala podmínku pro vytvoření pouze jedné instance. Implementujte metodu getInstance podle vzoru Singleton. Ve třídě Main upravte způsob vytváření instance factory tak, aby používala metodu getInstance.

3) Dependency injection

  • Ve třídě UniBankFactory doplňte anotaci @Named(“Uni”)
  • Ve třídě MainSpring doplňte anotace @Inject
  • Spusťte MainSpring.main() a sledujte, co program vypíše.
  • Ve třídě AbBankFactory doplňte anotace @Named(“Ab”) @Primary
  • Spusťte MainSpring.main() a sledujte, co program vypíše.
  • Ve třídě MainSpring doplňte anotaci @Qualifier(“Uni”)
  • Spusťte MainSpring.main() a sledujte, co program vypíše.
courses/b6b36omo/labs/lab072017.txt · Last modified: 2018/11/15 10:05 by mayerto1