gpt4 book ai didi

java - 如何实现工厂方法模式的灵活性

转载 作者:行者123 更新时间:2023-11-30 04:52:27 25 4
gpt4 key购买 nike

我有下面的抽象方法模式示例。

public interface Product {
public void draw();
public void move();
}

public abstract class Creator {
public Product anOperation() {
Product product = factoryMethod();
return product;
}

public abstract Product factoryMethod();
}

public class ConcreateProduct1 implments Product {
public void draw() {
}

public void move():
}
}

public class ConcreteCreator1 extends Creator {
public Product factoryMethod() {
return new ConcreateProduct1();
}
}

public class Client {
public static void main(String arg[]) {
Creator creator = null;
creator = new ConcreteCreator1();
creator.anOperation().move();
}
}

到目前为止,我已经了解到添加新产品的灵 active 是工厂方法模式的主要优点。

有人可以解释一下我们如何实现在下面的示例中无法实现的灵 active 吗?

public class ConcreateProduct1 {
public void draw() {
}

public void move():
}
}

public class Client {
public static void main(String arg[]) {
ConcreateProduct1 creator = new ConcreteCreator1();
creator.move();
}
}

最佳答案

在你的例子中它几乎没有用。我认为工厂模式永远不需要:您总是可以用其他方式做同样的事情,但有时出于某种原因使用它很方便。例如,它可以与私有(private)构造函数结合使用来限制资源使用 - 这是一种缓存策略

与反射代码结合使用时,还有另一个有趣的用法。想象一下,您在不知道接口(interface)的任何具体实现的情况下编写了 Factory 类。最常见的示例是 JDBC API。在客户端代码中,您可以通过类似 <driverId>:<params> 的 URL 访问数据库。 。工厂有HashMap<String, Class>所以它可以根据 <driverId> 实例化正确的类型使用此代码

Class driverClass = drivers.get(driverId);
Constructor constructor = driverClass.getDeclaredConstructor();
return constructor.newInstance(params);

工厂供应商不需要更改实现来添加新的驱动程序,因为它们是动态注册和实例化的(在 jdbc 中,这是通过 Class.forName("com.example.Driver") 发生的)。请注意,这似乎仍然是不必要的复杂性:为什么使用工厂只是为了获取您必须知道的类的实例?在这种情况下,明显的优势是灵 active :驱动程序名称是一个可以外部化的字符串(例如在配置文件中)。这样,最终用户(而不是开发人员)就可以在驱动程序之间切换,而无需重新编译应用程序。

关于java - 如何实现工厂方法模式的灵活性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9529094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com