Fö6 - Design patterns
Fö6 - Design patterns
Fö6 - Design patterns
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