我的工厂方法代码如下:
public class DBFactory {
protected DBFactory() {}
protected static DataBase createDB() { return null; }
}
public class MySQLFactory extends DBFactory{
private MySQLFactory() {}
public static DataBase createDB() {
return new MySQL();
}
}
public class SQLServerFactory extends DBFactory{
private SQLServerFactory() {}
public static DataBase createDB() {
return new SQLServer();
}
}
public class Test {
public static void main(String[] args) {
DataBase db = SQLServerFactory.createDB();
db.connect();
}
}
我发现它与下面的客户代码没有区别:
package factorymethod;
import db.DataBase;
public class Test {
public static void main(String[] args) {
DataBase db = new MySQL();
db.connect();
}
}
问题是,为什么我必须使用工厂方法?我觉得它变得更加冗长......
答案 0 :(得分:3)
当您需要虚拟构造函数时,可以使用工厂方法:运行时的不同类型。
对new
的调用只能创建一种类型。
工厂可以创建一系列类型,只要它们具有公共接口或父类,具体取决于传入的参数。
答案 1 :(得分:3)
如果您创建了类Abstract Factories,并且工厂方法是非静态的,那么它会更有意义,因为您可以在运行时向客户端提供抽象工厂:
public interface DBFactory { // Note: interface, not abstract class
public DataBase createDB();
}
public class MySQLFactory implements DBFactory {
public DataBase createDB() {
return new MySQL();
}
}
public class SQLServerFactory extends DBFactory{
public DataBase createDB() {
return new SQLServer();
}
}
然后
DBFactory factory = // provide whichever based on runtime settings
DataBase dataBase = factory.createDB(); // client uses whatever is returned
答案 2 :(得分:1)
Factory Method是一种软件设计模式,可帮助您实现类的类别分类的实例化。
如果您只是实例化一个类并且不希望将来更改代码以适应新类,那么您可以安全地避免应用该模式,因为它确实过分冗长/不必要。
答案 3 :(得分:0)
您可以使用工厂方法来实现单例设计模式。
例如,假设在应用程序生命周期的任何时候都不需要有多个MySQL()对象。您可以使用工厂方法来确保永远不会创建多个MySQL()对象。请考虑以下(psuedoesq)代码:
public class MySQLFactory extends DBFactory{
private MySQLFactory() {}
private MySQL myObject;
public static DataBase createDB() {
if(myObject == null) {
myObject = new MySQL();
}
return myObject;
}
}
使用此代码,您几乎可以保证永远不会创建该对象的多个实例。这有助于在创建新对象时节省资源,这可能很昂贵。
编辑:我确实认为我超出了原始问题的范围。答案 4 :(得分:0)
工厂方法模式允许您在不触及基类的情况下分配特定的具体对象。这促进了开放/封闭原则和依赖性倒置原则。后者表明:“从不依赖于混凝土类,但制造低级元素(混凝土对象)取决于高级元素(抽象元素)”。
的确,想象一下你有三种数据库。如果没有工厂模式(或抽象工厂模式),您最终会得到以下代码:
protected DBFactory(String database) {
if (database.equals("MySQL")) {
this.database = new MySql();
} else if (database.equals("PostgreSQL") {
this.database = new PostgreSQL();
}
else{
this.database = new Oracle();
}
}
工厂模板方法允许您通过继承指定此子类型。 它在实例化时是固定的,并且在运行时不能更改,与抽象工厂模式相反。
因此,如果没有工厂,只要您想添加新类型的数据库,就必须违反开放/封闭原则,因此可能会破坏基类的现有工作功能。
无论如何,在您的具体情况下,使用它是没有意义的。 为什么?因为当程序使用工厂(包含业务逻辑的程序的心脏)而不是“主”方法或任何其他只是将这些逻辑组件混合,提供和操作的流程时,它特别有用。
答案 5 :(得分:0)
@ user984444和@ Mik378得到了重点。 工厂方法可以: 1.保证实例为单身人士。 2.使用不同的方法/参数产生不同的具体实例。而且您不必查看子类/实现。
更好地理解工厂方法模式是,假设您在工厂,并且您不知道生产过程,但您可以获得所需的产品。我们来看看class diagram。 MealFactory factory = new ChineseMealFactory(); factory.prepareDessert()将返回ChineseDessert。 就是这样。