0

我的工厂方法代码如下:

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

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

4

6 回答 6

3

当您需要虚拟构造函数时,您可以使用工厂方法:运行时的不同类型。

调用new只能创建一种类型。

工厂可以创建一系列类型,只要它们具有公共接口或父类,具体取决于传入的参数。

于 2012-11-01T18:17:28.350 回答
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
于 2012-11-01T18:21:20.003 回答
1

工厂方法是一种软件设计模式,可帮助您实现类家族分类法的实例化。

如果您只实例化一个类并且不期望您的代码在将来更改以适应新类,那么您可以安全地避免应用该模式,因为它确实过于冗长/不必要。

于 2012-11-01T18:17:26.850 回答
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();
   }
} 

工厂模板方法允许您通过继承指定此子类型。它在实例化时是固定的,在运行时不能更改,这与抽象工厂模式相反。

所以如果没有工厂,一旦你想添加一种新的数据库,你就必须违反开放/封闭原则,因此可能会破坏基类的现有工作功能

无论如何,在您的特定情况下,使用它是没有意义的。为什么 ?因为当程序(程序的核心包含业务逻辑)而不是“main”方法或任何其他只是集中、提供和操作这些逻辑组件的流程流使用工厂时,它特别有用。

于 2012-11-01T18:26:05.007 回答
0

@user984444 和 @Mik378 明白这一点。工厂方法可以: 1.保证实例为单例。2.用不同的方法/参数产生不同的具体实例。而且您不必检查子类/实现。

对工厂方法模式的更好理解是,假设你在工厂,你不知道生产过程,但你可以得到你想要的产品。让我们看一下类图。MealFactory factory=new ChineseMealFactory(); factory.prepareDessert() 将返回 ChineseDessert。而已。

于 2012-11-02T16:38:19.160 回答
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;
    }
}

使用此代码,您几乎可以保证不会创建多个该对象的实例。这有助于在创建新对象时节省资源,这可能很昂贵。

编辑:我确实相信我超出了您最初问题的范围。

于 2012-11-01T18:21:21.077 回答