我正在阅读工厂方法模式。
我可以理解什么时候有一个工厂类,即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);
}
}
我的例子是设计的,但模仿上述链接。
这个实现对我来说似乎有点鸡蛋。使用Factory Method模式消除了客户端代码指定类类型的需要,但现在客户端代码需要有选择地选择要使用的正确工厂,即StoreFactoryA
,StoreFactoryB
?
这里使用抽象类的原因是什么?
答案 0 :(得分:4)
遗憾的是,您正在阅读的链接并未提供该模式的实际示例。实际上,根据原始的GoF设计模式,这种模式称为抽象工厂(工厂方法是一种不同的模式)。
当您拥有可以创建对象族的工厂时,将使用工厂模式。例如你可以拥有AbstractGUIFactory
可以有方法createButton(), createWindow(), createTitleBar
等等。然后,你会有像WindowsGUIFactory, MacGUIFactory, MotifGUIFactory
等具体的工厂,每个工厂都会生成Button, Window, TitleBar
个对象。办法。
工厂将在应用程序的某个位置设置为一个实现(可能使用配置),然后在需要创建对象的任何地方使用该工厂。
如果您正在学习设计模式,最好的建议是从经典的GoF书开始。
答案 1 :(得分:0)
模式变得有趣,特别是在测试方面。现在,您可以将AbstractFactory
注入到类中,并为不同的环境或测试选择不同的类型,而无需更改类(如果工厂创建共享公共接口的类型)。
使用类不必依赖于工厂的具体实现,也不必依赖于所创建类型的实际实现。
答案 2 :(得分:0)
使用Factory方法时,该方法仍在对象中,您需要实例化正确的对象才能访问该方法。你实现的唯一抽象是因为Abstract类。
工厂方法模式以这种方式设计。也许,你期望它类似于抽象工厂模式,它具有比工厂方法更好的抽象。
答案 3 :(得分:0)
通过控制反转获得可扩展性和解耦,同时仍然允许对象控制实际过程和时间。