作者:gaocai0102_264 | 来源:互联网 | 2023-10-10 10:40
我正在阅读Head First设计模式,我有一个问题.在书的开头,我看到了这个原则:
Favor ‘object composition’ over ‘class inheritance
然后我看到了工厂方法
abstract class Creator{
abstract Product create(String type);
}
和子类化
class ConcreteCreator extends Creator{
Product create(String type){
//creation
}
}
但是我们可以用Simple Factory组成我们的课程,例如
class OurClass{
SimpleFactory factory;
void ourMethod(){
Product product = factory.create(String type);
}
void setFactory(SimpleFactory factory){
this.factory = factory;
}
interface SimpleFactory {
Product create(String type);
}
class AnotherConcreteCreator implements SimpleFactory {
Product create(String type){
//creation
}
}
从第二种方法中,我们给出松散的耦合和可互换的.但是工厂方法存在-因此有人需要它.工厂方法的优点是什么?
解决方法:
首先,重要的是要区分factory method pattern和abstract factory pattern,为此请参见Differences between Abstract Factory Pattern and Factory Method和Why there are two separate patterns:Abstract Factory and Factory Method和What is the basic difference between the Factory and Abstract Factory Patterns?.如您所见,这有点棘手,因此我在下文中所说的必须带有盐.
特别是,您的OurClass示例在我看来是抽象工厂模式的典型用例.更具体地说,抽象工厂模式使您可以灵活地将要创建的对象的具体类型作为类的参数,并且其典型用例可以为dependency injection(即使通常以更自动化的方式完成),请参见也是Dependency Injection vs Factory Pattern.
粗略地说,在抽象工厂模式中,您将对象的构造委派给一个外部类(通常,该类不仅负责创建一个相关对象,而且还负责创建多个相关对象),而在工厂方法模式中,您将对象的构造委派给外部类子类.您还可以认为抽象工厂模式使用工厂方法模式作为其创建方法.
因此,对于何时使用工厂方法模式的问题的一个简单答案如下:当对象的创建是子类的职责时.这意味着,当只有子类应该或可以决定需要创建哪个对象时,这才是子类行为的一个方面,这使我们回到了最初的设想,并归结为一个问题:我何时应该使用继承? ,分别为Prefer composition over inheritance?.
另一方面,当外部因素决定需要创建哪些对象并且需要这种灵活性时,可以使用抽象工厂模式来描述它,从而证明代码需要额外的复杂性.