工厂方法模式的好处
Benefits from factory method pattern
我正在阅读 Head First Design Patterns,我有一个问题。在书的开头我看到了这个原则:
Favor 'object composition' over 'class inheritance
然后我看到了
的工厂方法
abstract class Creator{
abstract Product create(String type);
}
和子classing
class ConcreteCreator extends Creator{
Product create(String type){
//creation
}
}
但是我们可以用简单工厂组合我们的class,比如
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 and the abstract factory pattern, for this see Differences between Abstract Factory Pattern and Factory Method and Why there are two separate patterns:Abstract Factory and Factory Method and What is the basic difference between the Factory and Abstract Factory Patterns?很重要。如您所见,这有点棘手,因此必须对我在下面所说的持保留态度。
特别是,您的 OurClass
示例在我看来是抽象工厂模式的典型用例。更具体地说,抽象工厂模式使您可以灵活地使正在创建的对象的具体类型成为 class 的参数,它的典型用例可以是 dependency injection (even though this is typically done in a more automated way), see also Dependency Injection vs Factory Pattern.
粗略地说,在抽象工厂模式中,您将对象的构造委托给外部 class(通常,这个 class 不仅负责创建一个相关对象,而且还负责创建多个相关对象),而在工厂方法模式中,您将对象的构造委托给 subclasses。也可以认为抽象工厂模式的创建方法是使用工厂方法模式
因此,对于何时使用工厂方法模式这个问题的一个简单回答如下:何时创建对象是 subclass 的责任。这意味着,只有 subclass 应该或可以决定需要创建什么对象,因此是 subclass 行为的一个方面,这使我们回到了最初的假设和归结为一个问题:什么时候应该使用继承?分别Prefer composition over inheritance?。
另一方面,当外部因素决定需要创建哪些对象并且需要这种灵活性时,可以在您描述的情况下使用抽象工厂模式,从而证明代码需要额外的复杂性。
我正在阅读 Head First Design Patterns,我有一个问题。在书的开头我看到了这个原则:
Favor 'object composition' over 'class inheritance
然后我看到了
的工厂方法abstract class Creator{
abstract Product create(String type);
}
和子classing
class ConcreteCreator extends Creator{
Product create(String type){
//creation
}
}
但是我们可以用简单工厂组合我们的class,比如
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 and the abstract factory pattern, for this see Differences between Abstract Factory Pattern and Factory Method and Why there are two separate patterns:Abstract Factory and Factory Method and What is the basic difference between the Factory and Abstract Factory Patterns?很重要。如您所见,这有点棘手,因此必须对我在下面所说的持保留态度。
特别是,您的 OurClass
示例在我看来是抽象工厂模式的典型用例。更具体地说,抽象工厂模式使您可以灵活地使正在创建的对象的具体类型成为 class 的参数,它的典型用例可以是 dependency injection (even though this is typically done in a more automated way), see also Dependency Injection vs Factory Pattern.
粗略地说,在抽象工厂模式中,您将对象的构造委托给外部 class(通常,这个 class 不仅负责创建一个相关对象,而且还负责创建多个相关对象),而在工厂方法模式中,您将对象的构造委托给 subclasses。也可以认为抽象工厂模式的创建方法是使用工厂方法模式
因此,对于何时使用工厂方法模式这个问题的一个简单回答如下:何时创建对象是 subclass 的责任。这意味着,只有 subclass 应该或可以决定需要创建什么对象,因此是 subclass 行为的一个方面,这使我们回到了最初的假设和归结为一个问题:什么时候应该使用继承?分别Prefer composition over inheritance?。
另一方面,当外部因素决定需要创建哪些对象并且需要这种灵活性时,可以在您描述的情况下使用抽象工厂模式,从而证明代码需要额外的复杂性。