A lusta betöltés egy létrehozási programtervezési minta. Lényege, hogy elhalasztják az objektum létrehozását akkorra, amikor tényleg szükség van rá. Megfelelő használat esetén javíthatja a program válaszadási képességét és növelheti sebességét. Ellentéte a mohó betöltés. Akkor lehet vele sokat nyerni, ha nem feltétlenül van szükség arra, hogy inicializálódjon egy objektum, aminek inicializálása költséges.

Megvalósításai A mintának négy gyakran használt megvalósítási módja van: lusta inicializáció; virtuális helyettes; szellem; értéktartó.Martin Fowler, Patterns of Enterprise Application Architecture, Addison-Wesley, 2003, pp.200-214. . Mindegyiknek megvan a maga előnye és hátránya. Lusta inicializáció Lusta inicializáció esetén az objektum referenciája először nullra állítódik. Az objektum hívásai ellenőrzik, hogy az objektum null-e, és ha igen, akkor létrehozzák. Példa C#-ban:

private int myWidgetID; private Widget myWidget = null;

public Widget MyWidget { get

if (myWidget == null)

myWidget = Widget.Load(myWidgetID);

return myWidget;

Vagy a '??' operátorral private int myWidgetID; private Widget myWidget = null;

public Widget MyWidget { get { return myWidget = myWidget ?? Widget.Load(myWidgetID); } }

Ezt a legegyszerűbb megvalósítani, de mivel a null antimintának is tekinthető, szükség lehet egy null objektumra a null helyett. Virtuális helyettes A virtuális helyettes megvalósítja az objektum interfészeit. Ha először hívják az objektum metódusát, akkor betölt, és delegál.

Szellem A szellem egy objektum, ami betölthető részlegesen. Először csak az objektum azonosítóját tartalmazza, és a többi adatot csak akkor tölti be, amikor először szükség van rájuk. Példaként tegyük fel, hogy a kliens a tartalomhoz online formában akar hozzáférni. Létrehozáskor tudjuk, hogy magára az objektumra szükség lesz, de nem tudjuk, hogy mely adatok kellenek, és mely metódusokat fogják hívni. PHP példa:

$userData = array ( "UID" = > uniqid(), "requestTime" => microtime( true ), "dataType" => "", "request" => "" );

if (isset( $_POST['data'] ) && $userData) { //...

} Értéktartó Az értéktartó generikus objektum, ami megvalósítja a lusta betöltést, és az objektum adatmezői helyett jelenik meg.

C# példa: private ValueHolder<Widget> valueHolder;

public Widget MyWidget { get

return valueHolder.GetValue();

Jegyzetek

Fordítás

Kategória:Programtervezési minták Kategória:C Sharp-kódpéldák