Nedan finns kommentarer kring olika delar av laboration 3

Kommentar angående Abstract Factory

Möstret Abstract Factory förknippas nog i allmänhet med att man har en basklass (Abstract Factory) som innehåller ett gränssnitt. Gränssnittet består av ett antal funktioner för att skapa objekt av olika typer, t.ex. fönster, menyer etc. Funktionerna kan heta createWindow, createMenu osv. Därefter skapar man konkreta subklasser till den abstrakta fabriken. Subklassernas uppgift är att implementera gränssnittet och att, vid anrop, kunna returnera ett objekt av rätt typ, t.ex ett nytt fönster, en ny meny osv. Finessen är att varje konkret fabrik returnerar sin typ av objekt; en fabrik kan returnera ett fönster för motifmiljö, en annan fönster för OpenLook osv. Det enda som behöver bytas i koden för att den ska fungera i en ny fönstermiljö är själva fabriken.

I Smalltalk, som saknar typning, behöver man inte nödvändigt vis ha en abstrakt fabrik med konkreta subklasser. I stället kan man utnyttja t.ex. en Dictionary och stoppa in de klasser som man vill skapa objekt av som värden för olika nycklar. Om man t.ex. lägger in klassen MyWindow som värde med nyckeln #window kan man nu skapa ett objekt av klassen MyWindow genom att plocka fram värdet som har nyckeln #window och skicka ett lämpligt meddelande till objektet. Om man istället under nyckeln #window stoppar in YourWindow kommer samma kod att skapa ett objekt av typen YourWindow.

I den tillämpning som ni skriver här skapas egentligen inga objekt utan i katalogen lägger man in redan färdiga objekt. Det gör att vi inte har ett rent fabriksmönster utan en variant av det.

Tips angående Abstract Factory

Använd ett Dictionary för namedParts. Tex
   dict := Dictionary new.
   dict at: #circle put: L2Circle. "Vi kan lägga in klass"
   dict at: #nisseCirkel put: L2Circle new.  "eller instans (bara vi vet vad vi gör)"

   "För att läsa objekt från dictionary gör vi"
   dict at: #circle.
   dict at: #nisseCirkel
Då skulle metoderna partNamed respektive create kunna se ut så här:
   partNamed: aSymbol
      ^dict at: aSymbol

   create: aSymbol
      ^(self partNamed: aSymbol) new

Kommentar angående Observer

Tänk er (metaforiskt) att Mbox är en fil (tex /var/spool/mail/USERNAME), MboxInspector indikerar att nya mail läggs i mailboxen och Eater helt enkelt tar bort ett mail i taget (tex när det läses i Netscape så tas det också bort från mailboxen)