10.11.2014 Views

Fö6 - Design patterns

Fö6 - Design patterns

Fö6 - Design patterns

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Martin Karlsson<br />

TNM021 Programvaruutveckling<br />

<strong>Design</strong>mönster<br />

• Singleton (S)<br />

• Av vissa klasser ska det<br />

endast finnas ett objekt<br />

• ex. kölappsutdelare<br />

• Allt fungerar bra tills någon<br />

skapar ytterligare ett objekt<br />

av samma typ, som då ger<br />

samma nummerserie<br />

• “Lösningar” kan vara att...<br />

• Skriva en kommentar att bara skapa ett objekt i taget i koden, men hur<br />

många läser kommentarer egentligen?<br />

• Lägga in en räknare i klassen som håller reda på hur många objekt som<br />

skapas, men då har ju objektet redan skapats när vi kör programmet<br />

• Sätta variabeln och metoden som static, då kommer vi inte skapa något<br />

objekt alls, utan det blir en global räknare i programmet<br />

• Sätta variabeln och metoden som private ... bättre, men inte bäst...<br />

7<br />

public class TicketDispenser {<br />

private int nr;<br />

public TicketDispenser() {<br />

nr = 1;<br />

}<br />

public int getNext() {<br />

return nr++;<br />

}<br />

}<br />

-----------------------------<br />

TicketDispenser ticket = new<br />

TicketDispenser();<br />

int myNumber = ticket.getNext();<br />

Martin Karlsson<br />

TNM021 Programvaruutveckling<br />

<strong>Design</strong>mönster<br />

• Singleton (S) - lösningen<br />

public class TicketDispenser {<br />

private int nr;<br />

private static TicketDispenser singletonObject;<br />

private static TicketDispenser getInstance() {<br />

if (singletonObject == null)<br />

singletonObject = new TicketDispenser;<br />

return singletonObject;<br />

}<br />

private TicketDispenser() {<br />

nr = 1;<br />

}<br />

private int getNext() {<br />

return nr++;<br />

}<br />

}<br />

-------------------------------------------------------<br />

TicketDispenser ticket = new TicketDispenser();<br />

int myNumber = TicketDispenser.getInstance().getNext;<br />

8<br />

Endast ett objekt<br />

Instansieras vid behov<br />

Komplicerat men<br />

fungerande anrop<br />

<strong>Design</strong>mönster<br />

• Factory Method (FM)<br />

• För att få rätt sorts objekt skapat<br />

• Löser det genom att skjuta på skapandet av<br />

objektet till speciella factorymetoder som<br />

tillverkar ett objekt av rätt typ i subklassen<br />

• Polymorf lösning Employee<br />

EmployeeFactory<br />

- PayNumber<br />

- StartDate<br />

- Department<br />

+DoWork()<br />

+GetClass() : Employee<br />

<strong>Design</strong>mönster<br />

• Command (CD)<br />

• Att kapsla in kommandon (metoder) i ett objekt<br />

• Ibland vill man hantera ett kommando som ett<br />

objekt, skicka dem, och spara dem<br />

• Command används oftast för att ersätta långa sekvenser av villkorad<br />

kod (switch/case), och frikopplar den som anropar en metod från den<br />

som vet vad som ska utföras<br />

UndoMenu<br />

- undoStack<br />

*<br />

><br />

EditCommand<br />

+undo()<br />

Client<br />

Administration<br />

Security<br />

AdminCreator<br />

SecurCreator<br />

TextDocument<br />

AddText<br />

DeleteText<br />

+DoWork()<br />

+DoWork()<br />

+DoWork()<br />

+DoWork()<br />

- length<br />

- position<br />

- deletedText<br />

- position<br />

+undo()<br />

+undo()<br />

Martin Karlsson<br />

TNM021 Programvaruutveckling<br />

9<br />

Martin Karlsson<br />

TNM021 Programvaruutveckling<br />

10<br />

<strong>Design</strong>mönster<br />

• Observer (O)<br />

• För att ge ett objekt, oberoende av kännedom om<br />

andra objekt, möjligheten att distribuera<br />

meddelanden till dessa<br />

• Kallas i GUI-sammanhang för model-viewcontroller<br />

(MVC) och kan realiseras så här:<br />

<strong>Design</strong>mönster<br />

• Mediator (M)<br />

• För att öka självständighet och undvika beroende<br />

Klient<br />

Klient<br />

Controller<br />

Mediator<br />

uses<br />

manipulates<br />

User<br />

Model<br />

Klient<br />

Klient<br />

sees<br />

View<br />

updates<br />

Problemdomän<br />

Martin Karlsson<br />

TNM021 Programvaruutveckling<br />

11<br />

Martin Karlsson<br />

TNM021 Programvaruutveckling<br />

12

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!