我正在阅读工厂方法模式。
我可以理解当有一个工厂类时,即 StoreFactory#getStore()
,它返回一个基于某些运行时或其他状态的 Store
实现。
但是,从阅读(例如 this link)来看,似乎存在一种人们创建抽象工厂类的一般模式,其他工厂类扩展到该抽象工厂类:
public abstract class AbstractFactory {
public abstract Store getStore(int store);
}
public class StoreFactoryA extends AbstractFactory {
public Store getStore(int Store) {
if(Store == 1) { return new MyStoreImplA(); }
if(Store == 2) { return new MyStoreImplB(); }
}
}
public class StoreFactoryB extends AbstractFactory {
public Store getStore(int Store) {
if(Store == 1) { return new MyStoreImplC(); }
if(Store == 2) { return new MyStoreImplD(); }
}
}
public class Runner {
public static void main(String[] args) {
AbstractFactory storeFactory = new StoreFactoryA();
Store myStore = storeFactory.getStore(1);
}
}
我的例子是人为设计的,但是模拟了上述链接。
这个实现对我来说有点像先有鸡还是先有蛋。使用工厂方法模式消除了客户端代码指定类类型的需要,但现在客户端代码需要有选择地选择要使用的正确工厂,即 StoreFactoryA
、StoreFactoryB
?
这里使用抽象类的原因是什么?
最佳答案
不幸的是,您正在阅读的链接没有给出该模式的实际示例。事实上,根据最初的 GoF 设计模式,这种模式称为抽象工厂(工厂方法是一种不同的模式)。
当您拥有可以创建对象系列的工厂时,使用抽象工厂模式。例如您可以拥有 AbstractGUIFactory
,它可以拥有方法 createButton()、createWindow()、createTitleBar
等。然后,您将拥有像 WindowsGUIFactory、MacGUIFactory、 MotifGUIFactory
等,它们中的每一个都会以自己的方式生成 Button、Window、TitleBar
对象。
工厂将在应用程序的某个时刻设置为一个实现(可能使用配置),然后该工厂将在需要创建对象的任何地方使用。
如果您正在学习设计模式,最好的建议是从经典的 GoF 书籍开始。
关于java - 理解工厂方法模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12293427/