gpt4 book ai didi

java - 工厂方法模式中的创建者

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

source: https://en.wikipedia.org/wiki/Factory_method_pattern

来源:https://en.wikipedia.org/wiki/Factory_method_pattern

这张图真的暗示了工厂方法模式?

为什么我们需要 Creator?看代码示例:

 interface Product{
public String getName();
}

class ConcreteProduct1 implements Product {
@Override
public String getName() {
return "I'm product 1";
}
}

class ConcreteProduct2 implements Product {
@Override
public String getName() {
return "Im product 2!";
}
}

// CREATOR HERE

interface Creator{
public Product createProuct(String productClass);
}

class ConcreteCreator implements Creator{
@Override
public Product createProuct(String productClass) {
if(productClass.equals("1"))
return new ConcreteProduct1();
else if(productClass.equals("2"))
return new ConcreteProduct2();
else
return null; //
}
}

public class Test {
public static void main(String[] args) {
Creator c = new ConcreteCreator();
Product product = c.createProuct("1");
System.out.print(product.getName());
}
}

没有Creator界面的代码:

class ConcreteCreator{
public Product createProuct(String productClass) {
if(productClass.equals("1"))
return new ConcreteProduct1();
else if(productClass.equals("2"))
return new ConcreteProduct2();
else
return null; //
}
}

public class Test{
public static void main(String[] args) {
ConcreteCreator c = new ConcreteCreator();
Product product = c.createProuct("1");
System.out.print(product.getName());
}
}

那么为什么我们需要Creator接口(interface)呢?以防万一我将来添加另一个工厂方法?如果是,它还是工厂方法模式还是抽象工厂模式?您能否给我一些代码示例,其中包含对我的 Creator 接口(interface)的扩展以及使用两种方法的 ConcreteCreator 的实现?

还有通用的 Creator 怎么样?它看起来比许多类型指定的 Creators 简单得多......:

interface Product{
public String getName();
}

class ConcreteProduct implements Product{
@Override
public String getName() {
return "I'm product 1";
}
}

interface Moveable{
public String move();
}

class Car implements Moveable{
@Override
public String move() {
return "moving...";
}
}

interface Creator<T>{
public T create();
}

class ConcreteCreatorProducts implements Creator<Product>{
@Override
public Product create() {
return new ConcreteProduct();
}
}

class ConcreteCreatorCar implements Creator<Car>{
@Override
public Car create() {
return new Car();
}
}

public class Test{
public static void main(String[] args) {
Creator<Product> productCreator = new ConcreteCreatorProducts();
Product product = productCreator.create();
Creator<Car> carCreator = new ConcreteCreatorCar();
Car car = carCreator.create();
}
}

最佳答案

在您的示例中,您不需要 Creator 接口(interface),除非您想要多个实现并在它们之间进行交换。但该图实际上描述的模式与您实现的模式略有不同。

那里描述工厂方法模式的方式是基于原始的设计模式书籍。今天有点奇怪,因为它使用子类来配置类,而我们鼓励使用组合。因此,该图确实显示了工厂方法模式,但与许多其他地方描述的方式不同。

工厂方法模式是:

Define an interface for creating an object, but let subclasses decide which class to instantiate. The Factory method lets a class defer instantiation it uses to subclasses.

  • 在原始模式中,Creator 不是一个接口(interface)。 “接口(interface)”是指 Creator 定义的工厂方法,而不是像 Java 那样的接口(interface)。

  • 工厂方法不需要参数。不是根据参数返回不同的类型,而是根据创建的子类返回不同的类型。

  • 此外,您不会从 main 调用 createProduct,而是从 Creator 中的方法调用。 Creator 是工厂方法的使用者,所以它定义了一个工厂方法,可能是抽象的,以及一些使用该方法的其他方法。

请参阅维基百科页面上的 Java 示例。 MazeGame 类是 Creator。构造函数用作anOperation 方法,并且有多个子类用于创建不同类型的房间。

关于java - 工厂方法模式中的创建者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46114484/

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