延迟加载是一种概念,让我们将对象的加载推迟到真正需要它的时候才进行。
- 延迟加载实际上只是给“在真正需要时才初始化类”这一过程起的一个 fancy name(花哨的名字)。
- 简单来说,延迟加载是一种软件设计模式,其中对象的初始化仅在实际需要时发生,而不是提前进行,以保持使用的简洁性并提高性能。
- 当对象创建的成本非常高,而该对象的使用却非常罕见时,延迟加载就显得至关重要。因此,这是一种值得实施延迟加载的场景。延迟加载的基本思想是在需要时才加载对象/数据。
例如,假设我们正在创建一个应用程序,其中有一个 Company(公司)对象,该对象在 ContactList 对象中包含公司员工列表。一家公司可能有数千名员工。从数据库中加载 Company 对象以及 ContactList 对象中的所有员工列表可能会非常耗时。在某些情况下,您甚至根本不需要员工列表,但您却被迫等待,直到公司和员工列表全部加载到内存中为止。
一种节省时间和内存的方法是避免在需要之前加载员工对象,而这是通过使用延迟加载设计模式来完成的。
<a href="https://media.geeksforgeeks.org/wp-content/cdn-uploads/LazyLoading1.png"><img src="https://media.geeksforgeeks.org/wp-content/uploads/lazy-loading.png" alt="LazyLoading1" />
延迟加载模式有四种常见的实现方式:
- 虚拟代理
- 延迟初始化
- 幽灵模式
- 值持有者
虚拟代理
虚拟代理模式是一种节省内存的技术,建议将对象的创建推迟到需要它的时候。当创建一个对象在内存使用或涉及的处理方面代价昂贵时,通常会使用它。
Java
“
// Java program to illustrate
// virtual proxy in
// Lazy Loading Design Pattern
import java.util.List;
import java.util.ArrayList;
interface ContactList
{
public List getEmployeeList();
}
class Company {
String companyName;
String companyAddress;
String companyContactNo;
ContactList contactList;
public Company(String companyName, String companyAddress,
String companyContactNo, ContactList contactList)
{
this.companyName = companyName;
this.companyAddress = companyAddress;
this.companyContactNo = companyContactNo;
this.contactList = contactList;
}
public String getCompanyName()
{
return companyName;
}
public String getCompanyAddress()
{
return companyAddress;
}
public String getCompanyContactNo()
{
return companyContactNo;
}
public ContactList getContactList()
{
return contactList;
}
}
class ContactListImpl implements ContactList {
public List getEmployeeList()
{
return getEmpList();
}
private static List getEmpList()
{
List empList = new ArrayList(5);
empList.add(new Employee("Lokesh", 2565.55, "SE"));
empList.add(new Employee("Kushagra", 22574, "Manager"));
empList.add(new Employee("Susmit", 3256.77, "G4"));
empList.add(new Employee("Vikram", 4875.54, "SSE"));
empList.add(new Employee("Achint", 2847.01, "SE"));
return empList;
}
}
class ContactListProxyImpl implements ContactList {
private ContactList contactList;
public List getEmployeeList()
{
if (contactList == null) {
System.out.println("Fetching list of employees");
contactList = new ContactListImpl();
}
return contactList.getEmployeeList();
}
}
class Employee {
private String employeeName;
private double employeeSalary;
private String employeeDesignation;
public Employee(String employeeName,
double employeeSalary, String employeeDesignation)
{
this.employeeName = employeeName;
this.employeeSalary = employeeSalary;
this.employeeDesignation = employeeDesignation;
}
public String getEmployeeName()
{
return employeeName;
}
public double getEmployeeSalary()
{
return employeeSalary;
}
public String getEmployeeDesignation()
{
return employeeDesignation;
}
public String toString()
{
return "Employee Name: " + employeeName + ",
EmployeeDesignation : " + employeeDesignation + ",
Employee Salary : " + employeeSalary;
}
}
class LazyLoading {
public static void main(String[] args)
{
ContactList contactList = new ContactListProxyImpl();
Company company = new Company
("Geeksforgeeks", "India", "+91-011-28458965", contactList);
System.out.println("Company Name: " + company.getCompanyName());
System.o