使用静态工厂方法的动机如下:
Replace Constructor with Factory Method 最明显的动机是用子类化替换类型代码。
您有一个经常使用类型代码创建的对象,但现在需要子类。确切的子类基于类型代码。
但是,构造函数只能返回被请求的对象的一个实例。所以你需要用工厂方法替换构造函数。
谁能用代码解释一下?这个类型代码是什么意思?
使用静态工厂方法的动机如下:
Replace Constructor with Factory Method 最明显的动机是用子类化替换类型代码。
您有一个经常使用类型代码创建的对象,但现在需要子类。确切的子类基于类型代码。
但是,构造函数只能返回被请求的对象的一个实例。所以你需要用工厂方法替换构造函数。
谁能用代码解释一下?这个类型代码是什么意思?
工厂方法相对于裸构造函数的第二个优势是它可以返回现有对象。该Integer.valueOf(int)
方法很好地利用了这一点。相比之下,new
总是创建一个新对象。
最后,如果我们稍微扩大讨论范围,非静态工厂方法(例如以工厂对象的形式)允许您使用多态性来实现不同的对象创建策略。
这个类型代码是什么意思?
您需要在获得此内容的页面的上下文中阅读此内容。该页面所讨论的是代表不同“类型”事物的单个类。(在给出的例子中,一个Employee
类代表不同类型的员工。)“类型代码”只是区分不同类型的类的属性。
构造函数只能返回一个实现,但是静态工厂方法可以返回任意数量的实现,通常是所引用类的子类。静态工厂方法还具有命名的优点,因此您可以对相同的参数有不同的行为。
例如,这两个方法返回一个 EnumSet 的子类(基于枚举中元素的数量),根据名称(即使论点相同)具有不同的值
EnumSet<MemoryType> memoryTypes = EnumSet.noneOf(MemoryType.class);
EnumSet<MemoryType> memoryTypes2 = EnumSet.allOf(MemoryType.class);
从源头
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
您可以看到它有一种用于较小枚举集的实现,另一种用于较大的枚举集。
想象一下,我们有一个Person
类,其中有一个字段type
,用于指示该人是教师还是学生。这将是类型代码。
现在想象我们用对象层次结构替换这个类型字段:Person
具有 2 个子类的类Teacher
和Student
.
如果我使用构造函数,那么我只能创建特定类型的人,即new Teacher()
或new Student()
但是如果我想要一种基于某种逻辑创建不同类型的人的方法,那么我可以这样做:
public static Person newPerson() {
// can return either a Teacher or a Student
}