“Factory Method”和“使用New创建实例”之间有什么区别?

时间:2012-11-01 18:14:07

标签: java design-patterns

我的工厂方法代码如下:

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();
    }
}

问题是,为什么我必须使用工厂方法?我觉得它变得更加冗长......

6 个答案:

答案 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。 就是这样。