2. Avoid unnecessary computations.
3. Reduce unnecessary memory allocations.
4. Create objects when they are actually need.
5. Provide thread safe facility by framework.
This is very useful when you need create very expensive object when only you need to access members of these objects.
In here I will describe this Lazy initialization with following sample code.
I have created following class for the demonstration and created Order object as two types as lazy object and normal object.
isCustomerCreatedFinish is getting true after you actually access member within Customer object. (get the customer Id)
Also debug the Customer class constructor and there you can also notice until you call method/property inside the Order object it is not getting constructed but normal object will construct even you not call method/property inside order object.