繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM