public class Product { private int id; private String name; // 构造器 public Product(int id, String name) { this.id = id; this.name = name; } // 静态工厂方法 public static Product createProduct(int id, String name) { // 这里可以添加一些额外的逻辑,例如缓存 return new Product(id, name); } // Getter 和 Setter 方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Product{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
名称
- 构造器:构造器通常与类名相同,并且每当创建类的新对象时都会被调用。
- 静态工厂方法:静态工厂方法通常是类中的一个静态方法,可以任意命名。
可见性
- 构造器:构造器可以是public或private,但通常是public。
- 静态工厂方法:静态工厂方法可以是public、protected、private或默认的,提供了更多的灵活性。
返回类型
- 构造器:构造器总是返回类的实例。
- 静态工厂方法:静态工厂方法可以返回任何子类型的实例,这意味着可以返回类的不同实现,甚至可以返回非公开的类实例。
实例化过程
- 构造器:每次调用构造器时都会创建一个新的对象。
- 静态工厂方法:静态工厂方法可以缓存对象并返回已创建的对象,从而实现单例模式或享元模式。
参数
- 构造器:构造器在创建对象时必须提供所有必需的参数。
- 静态工厂方法:可以提供多个重载的静态工厂方法,每个方法都可以有不同的参数列表,从而可以返回不同配置的对象。
可读性
- 构造器:构造器的参数列表必须完整地定义在调用时。
- 静态工厂方法:静态工厂方法可以有更具描述性的名称,使得代码更加易于阅读和理解。
性能
- 构造器:每次调用都会创建新对象。
- 静态工厂方法:可以预先创建对象并在需要时返回,减少了对象创建的开销。
灵活性
- 构造器:在类定义时就必须确定构造器的参数和逻辑。
- 静态工厂方法:可以在不修改方法签名的情况下,改变返回对象的逻辑。
缺点
- 构造器:通常需要更多的代码来处理不同的情况。
- 静态工厂方法:类如果不包含任何public或protected的构造器,就不能被子类化。