这与创建和销毁本书中的对象有关[' Effective Java'作者:Joshua Bloch
第1项:考虑静态工厂方法而不是构造函数
此方法将布尔基元值转换为布尔对象引用:
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
请注意,静态工厂方法与Factory不同 设计模式中的方法模式[Gamma95,p。 107]。静电 本项目中描述的工厂方法没有直接等效的 设计模式。
作者似乎在谈论静态工厂方法和工厂方法模式之间的区别。这有什么区别?
另外,BalusC 提到in this thread,工厂方法下的链接,java.util.Calendar#getInstance()这是一个静态工厂方法,因此建议静态工厂方法是工厂方法模式的子集。
答案 0 :(得分:5)
工厂方法模式
工厂方法是用于创建对象的接口。此接口的具体实现指定要创建的具体对象。
工厂方法模式在客户端必须实例化对象时使用,但它不应该知道它是如何创建的。
+------------+ uses +-------------+
| Client | ----------> | Factory |
+------------+ +-------------+
| uses | create() |
V +-------------+
+------------+ ^
| SomeObject | |
+------------+ |
^ |
| |
+--------------------+ create +------------------+
| SomeConcreteObject | <-------- | ConcreateFactory |
+--------------------+ +------------------+
静态工厂方法
静态工厂方法模式是一种编写干净代码的方法。这是一种为构造函数提供更有意义的名称来表达它的功能的方法。 E.g。
List<String> newList = new ArrayList<String>(otherList);
上面的代码是什么意思?
newList
是otherList
的副本还是ArrayList
保留otherList
的引用,只是委托对它的调用(如包装器)?
我想每个人都知道上面代码的作用,因为我们读了javadoc。然而,如果使用静态工厂方法,则代码在不读取javadoc的情况下会更清晰。 E.g。
List<String> copy = ArrayList.copyOf(otherList);
SortedSet<SomeObject> sortedSet = TreeSet.orderedBy(comparator);
使用静态工厂方法,也可以编写多个构造函数&#39;使用相同的参数列表,因为您可以为每个人提供另一个名称。使用&#39; normal&#39;这是不可能的。构造函数。 E.g。
List<String> copy = ArrayList.copyOf(otherList);
List<String> delegateList = ArrayList.delegateOf(otherList);
答案 1 :(得分:1)
Google在搜索结果(来自维基百科)中弹出的工厂方法模式的定义是:
定义。 “定义用于创建对象的接口,但让子类决定实例化哪个类.Plant方法允许类将其用于子类的实例化延迟。
这里的关键是工厂作为接口传递给需要创建实例的类。这意味着可以实现工厂方法的多种实现。
静态工厂方法使用静态方法:该方法是静态引用的,而不是通过接口引用的。这意味着工厂方法只有一种实现方式。
答案 2 :(得分:0)
以下是“设计模式中的工厂方法模式”的定义[Gamma95,p。 107]” “定义用于创建对象的接口,但让子类决定实例化哪个类.Plant方法允许类将它用于子类的实例化延迟。”
模式不是单个静态方法,而是一个将被调用的接口(或抽象)方法,具体取决于实现它的类。
请查看以下示例:Factory method pattern
由于我们讨论的是设计模式,请记住上面的示例包含不良做法(从构造函数中调用抽象方法)。
请参阅:Is it OK to call abstract method from constructor in Java?