Ped*_* M. 5 java design-patterns factory factory-pattern
我一直在读" Head First:Design Patterns "这本书,我发现它是对设计模式的一个很好的介绍.但是,我对他们在第4章中提出的声明提出了一个问题:
它们定义了"Simple Factory"模式如下(Java伪代码):
public abstract class Product
{
// Product characteristics
// Concrete Products should subclass this
}
public class SimpleFactory {
public Product createProduct(){
// Return an instance of some subclass of Product
}
}
public class Store {
SimpleFactory factory;
public Product orderProduct(){
Product product = factory.createProduct();
// Do some manipulation on product
return product;
}
}
Run Code Online (Sandbox Code Playgroud)
"工厂方法"定义如下(类Product保持不变并省略):
public abstract class Store {
//Concrete Stores must subclass this and override createProduct()
public abstract Product createProduct();
public Product orderProduct(){
Product product = createProduct();
// Do some manipulation on product
return product;
}
}
Run Code Online (Sandbox Code Playgroud)
然后作者继续声称工厂方法模式比Simple Factory灵活得多,因为虽然Simple Factory是"一次性交易,但是使用Factory方法创建一个框架,让子类决定应该使用哪个实现" (第135页).
现在我不明白为什么这是真的.我看到它的方式,简单厂,在某种意义上,稍微更比工厂方法灵活:你也可以继承简单工厂(而不是继承的商店),以获得基本相同的行为.如果您愿意,甚至可以在运行时更改行为!我想到的Simple Factory的唯一缺点是产品创建依赖于Store类的状态变量:这是作者所说的灵活性,还是我错过了什么?
你是绝对正确的:作者的假设是你不会子类化SimpleFactory,这不是一个公平的假设(除非SimpleFactory被标记final)。
由于SimpleFactory不是最终的,因此您绝对可以对它进行子类化,从而获得比工厂方法更大的灵活性,因为SimpleFactory用组合代替了继承。
更好的方法是制作SimpleFactory一个界面。这样做可以让您根据自己的喜好选择组合或继承,因为当您的Store类已经继承了一个类时,接口不会限制您。
public interface SimpleFactory {
Product createProduct();
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用任一组合
public class FactoryImpl implements SimpleFactory {
public Product createProduct(){
// Return an instance of some subclass of Product
}
}
public class StoreComposition {
SimpleFactory factory = new FactoryImpl();
}
Run Code Online (Sandbox Code Playgroud)
或继承/组合组合
public class StoreInheritance implements SimpleFactory {
SimpleFactory factory = this;
public Product createProduct(){
// Return an instance of some subclass of Product
}
}
Run Code Online (Sandbox Code Playgroud)