[英]What's the difference between “Factory Method” and “using New to create an instance”?
我的工厂方法代码如下:
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();
}
}
问题是,为什么我必须使用工厂方法? 我认为它变得更加冗长...
当需要虚拟构造函数时,可以使用工厂方法:运行时使用不同的类型。
调用new
只能创建一种类型。
工厂可以创建一系列类型,只要它们具有公共接口或父类(取决于传入的参数)即可。
如果将类设为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
工厂方法是一种软件设计模式,可帮助您实现类的类分类法实例化。
如果您仅实例化一个类,并且不希望将来的代码发生变化以适应新的类,那么您可以放心地避免应用该模式,因为它确实是不必要的冗长/不必要的。
您可以使用工厂方法来实现单例设计模式。
例如,假设在应用程序生命周期中的任何时候都不需要有多个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;
}
}
使用此代码,几乎可以保证您不会创建该对象的多个实例。 这有助于在创建新对象时节省资源,这可能会很昂贵。
编辑:我确实相信我已经超出了您原来的问题范围。
工厂方法模式允许您分配特定的具体对象,而无需接触基类。 这促进了开放/封闭原则和依赖倒置原则 。 后者表示:“从不依赖于具体的类,而使低级元素(具体对象)依赖于高级元素(抽象对象)”。
确实,假设您有三种数据库。 没有工厂模式(或抽象工厂模式),您将得到以下代码:
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();
}
}
工厂模板方法允许您通过继承指定此子类型。 与抽象工厂模式相反,它在实例化时是固定的,并且在运行时无法更改。
因此,在没有工厂的情况下,您要添加一种新型的数据库,就必须违反“打开/关闭”原则,因此有可能破坏基类的现有工作功能 。
无论如何,在您的特定情况下,没有意义使用它。 为什么呢 因为当工厂用于程序(程序的核心包含业务逻辑)而不是“主要”方法或任何其他仅处理,馈送和操纵这些逻辑组件的处理流程时,它特别有用。
@ user984444和@ Mik378明白了这一点。 工厂方法可以:1.确保实例为单例。 2.使用不同的方法/参数产生不同的具体实例。 而且您不必签出子类/实现。
对工厂方法模式的更好理解是,假设您在工厂中,并且对生产过程一无所知,但是可以获得所需的产品。 让我们看一下类图 。 MealFactory factory = new ChineseMealFactory(); factory.prepareDessert()将返回ChineseDessert。 而已。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.