4.1 Byggare
Builder är ett generativt designmönster som ger ett sätt att skapa ett sammansatt objekt.
Separerar konstruktionen av ett komplext objekt från dess representation så att samma konstruktionsprocess kan resultera i olika representationer.
![Byggare](https://cdn.codegym.cc/images/article/73f76c69-6b2a-4034-9207-93871bb16fae/800.jpeg)
Styrkor:
- låter dig ändra den interna representationen av produkten;
- isolerar koden som implementerar konstruktion och presentation;
- ger bättre kontroll över designprocessen.
Svaga sidor:
- Algoritmen för att skapa ett komplext objekt bör inte bero på vilka delar objektet består av och hur de passar ihop;
- byggprocessen måste ge olika representationer av objektet som konstrueras.
Ett bra exempel är klassen HttpRequest, som har en underklass HttpRequest.Builder som kan användas för att skapa instanser av klassen HttpRequest och säkerställa att de är giltiga.
4.2 Lat initialisering
Lat initialisering är en programmeringsteknik när någon resurskrävande operation (objektskapande, värdeberäkning) utförs omedelbart innan dess resultat används.
Sålunda utförs initiering "på begäran" och inte i förväg. En liknande idé kan tillämpas inom en mängd olika områden: till exempel on-the-fly kompilering och Just-in-Time logistikkonceptet.
![Lat initiering](https://cdn.codegym.cc/images/article/fa045df5-58b9-4433-bc35-45548f452406/800.jpeg)
Ett specialfall av lat initialisering - att skapa ett objekt vid tidpunkten för åtkomst till det - är ett av de generativa designmönstren. Den används vanligtvis i kombination med mönster som Factory Method, Loner och Proxy.
Styrkor:
- Initialisering utförs endast när det verkligen behövs;
- Den initiala initieringen av applikationen påskyndas: allt som kan skjutas upp skjuts upp.
Svaga sidor:
- Det är inte möjligt att uttryckligen ställa in i vilken ordning objekt initieras;
- Det finns en fördröjning vid den första åtkomsten till objektet, vilket kan vara kritiskt när ytterligare en resurskrävande operation utförs parallellt. På grund av detta är det nödvändigt att noggrant överväga lämpligheten av att använda lat initiering i flertrådade programvarusystem.
Kommer du ihåg hur du kunde ange startordningen för servlets där när du skrev web.xml? Detta är exakt resultatet av lat lastning. Tomcat kommer att skapa servletobjekt första gången de används.
4.3 Objektpool
En objektpool är ett överordnat designmönster, en uppsättning initierade och färdiga att använda objekt. När systemet behöver ett objekt skapas det inte, utan tas från poolen. När ett föremål inte längre behövs förstörs det inte utan återförs till poolen.
![objektpool](https://cdn.codegym.cc/images/article/780f7d14-5ad3-42e2-bbfe-409cef49851e/512.jpeg)
Objektpoolning används för att förbättra prestanda när man skapar ett objekt i början av ett jobb och att förstöra det i slutet är dyrt. Prestandaförbättringen är särskilt märkbar när objekt skapas och förstörs ofta, men bara ett litet antal av dem existerar samtidigt.
En objektpool är användbar när ett objekt äger andra resurser än minne, till exempel nätverksuttag. Eller om samlingen av föremål tar upp en betydande del av datorns minne och det skapas mycket "skräp".
Som du kommer ihåg, kör Tomcat varje begäran i en separat tråd. Men trådar skapas inte varje gång på nytt, utan lagras i trådpoolen. Detta möjliggör snabbare exekvering av förfrågningar: när en tråd behövs tas den helt enkelt från poolen. Frågan är förresten: hur skulle man stoppa in den löpande tråden i poolen och ta den från poolen?