当前位置: 首页 > 知识库问答 >
问题:

使用factory方法设计模式时确定要使用的factory

郗鹏
2023-03-14

我目前正在对工厂设计模式进行一些研究,并列出了我对每种模式的理解的简要描述。如果有不正确的地方,请纠正我。

1) 工厂——简单,实际上不是正式的设计模式,通常是一个类,它有一个或多个方法(有时是静态的)接受一个参数,以确定要返回哪个抽象类型的子类。

2) 工厂方法——正式的模式,使用抽象工厂类。对于预期退货类型的每个产品,创建一个关联的factory类,并实现或重写所需的方法。在客户机代码中,虽然变量被声明为抽象工厂,但它是用具体实现实例化的。

3)抽象工厂-一种模式,通过各种相互关联或依赖的方法返回多种类型的对象。

我的问题是,我一直在使用共享方法的工厂(不是正式的模式)。然而,我正在考虑使用factory方法并使用它,但我无法弄清楚的是如何确定抽象factory类的哪个子类用于创建我的产品。据我目前所知,您仍然使用new关键字为声明为抽象工厂类的变量分配一个具体的类。

例如:

昏暗工厂1 As IFactory=New ConcreteFactory1

将工厂2的尺寸标注为IFactory=新混凝土工厂2

例如,如果我想根据数据库记录动态确定我想返回哪个IFactory,我将如何做到这一点?我最好让代码使用工厂模式而不使用工厂方法模式吗?我想避免在客户端代码中执行选择案例或if语句。我可以将工厂方法模式包装在工厂模式中吗?

希望我讲得通

共有1个答案

袁致远
2023-03-14

嗯,这取决于你将使用的语言来支持设计的想法。我将在Java描述这个想法,让我们开始吧。

您拥有以下内容:

AbstractFacotry instance1 = new ConcreteFacotry1();
AbstractFacotry instance2 = new ConcreteFacotry2();

您想避免必须放置ConcretFactory#。这就是为什么您将使用一个工厂类来负责根据参数(在您的情况下,您提到的数据库记录)为您提供正确的ConcretFactory#实例。我会尽量简短地解释,希望我不会在这个过程中失去任何人。

我将从创建抽象类AbstractFactory开始,并从抽象类AbstractFactory扩展到具体类,以实现示例的目的。

public abstract class AbstractFactory {}

当然你的会更详细,我只需要实例化它来运行几个测试。现在,让我们来介绍一下从中延伸出来的课程:

public class ConcreteFactory1 extends AbstractFactory {}

我不会粘贴其他的代码,它们都是一样的。这是我创建的类:ConcreteFactory1、ConcreteFactory2、ConcreteFactory3、ConcreteFactory4。

接下来是负责根据您的数据库参数为您提供AbstractFactory具体实例的类。此实现假设不会有超过15个左右的数据库参数。并且所述数据库参数可以转换为字符串。

public class FactoryInstantiator {
public AbstractFactory optionOne(){
    return new ConcreteFactory1();
}

public AbstractFactory optionTwo(){
    return new ConcreteFactory2();
}

public AbstractFactory optionThree(){
    return new ConcreteFactory3();
}

public AbstractFactory optionFour(){
    return new ConcreteFactory4();
}
}

显然,名称选项#是数据库参数的字符串翻译。

最后一件事是创建负责根据数据库参数调用正确方法的类。这是果汁所在,也是您避免if-elses和开关的地方。这是您将从客户端调用的类。

public class FactoryHandler {

public AbstractFactory getInstance(String databaseParameter) {
    try {
        return  getConcreteInstance(FactoryInstantiator.class, databaseParameter);
    } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | 
             InvocationTargetException | NoSuchMethodException ex) {
        Logger.getLogger(FactoryHandler.class.getName()).log(Level.SEVERE, null, ex);
    }
    throw new RuntimeException("Could not determine concrete instance based on data base parameter");
}


private AbstractFactory getConcreteInstance(Class<FactoryInstantiator> factoryInstantiator, String databaseParameter) 
                    throws InstantiationException, IllegalAccessException, IllegalArgumentException, 
                    InvocationTargetException, NoSuchMethodException {    
    Class[] methodParameterTypes=null;
    Object instance = factoryInstantiator.newInstance();
    Method method = factoryInstantiator.getDeclaredMethod(databaseParameter, methodParameterTypes);
    return  (AbstractFactory) method.invoke(instance);
}

}

具体来说,您将调用getInstance(…)方法来获取具体实例。此方法负责捕获调用getConcreteInstance(..)时可能出现的任何html" target="_blank">异常。这种分离是为了可读性和清晰性。

真正的交易是在getConcreteInstance(...)中负责基于dbParameter调用FactoryInstantiator中的适当方法。

让我们在主类中使用它,如下所示:

public class Main {

public static void main(String[] args) {
    ArrayList<AbstractFactory> factories = new ArrayList<>();
    ArrayList<String> dbParameters = getDBparameters();
    FactoryHandler factoryHandler = new FactoryHandler();

    for(String dbParameter:dbParameters)
        factories.add( factoryHandler.getInstance(dbParameter) );

    for(AbstractFactory factory : factories)
        System.out.println(factory.getClass());

}

private static ArrayList<String> getDBparameters(){
    ArrayList<String> dbparameters = new ArrayList<>();
    dbparameters.add("optionOne");
    dbparameters.add("optionTwo");
    dbparameters.add("optionThree");
    dbparameters.add("optionFour");
    return dbparameters;
}

}

以下是打印件:

class ConcreteFactory1
class ConcreteFactory2
class ConcreteFactory3
class ConcreteFactory4

就在这里。希望有帮助。

 类似资料:
  • 定义:提供创建对象的接口 为何使用? 工厂模式是我们最常用的模式了,着名的 Jive 论坛,就大量使用了工厂模式,工厂模式在 Java 程序系统可以说是随处可见。 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如 A a = new A() 工厂模式也是用来创建实例对象的,所以以后 new 时就要多个心眼,是否可以考虑实用工厂模式,虽然

  • 问题内容: 我正在从网站上阅读设计模式 在那里我读到了有关Factory,Factory方法和Abstract工厂的信息,但是它们是如此混乱,在定义上还不清楚。根据定义 工厂-在不将实例化逻辑暴露给客户端的情况下创建对象,并通过公共接口引用新创建的对象。是Factory Method的简化版本 工厂方法-定义用于创建对象的接口,但让子类决定要实例化的类,并通过通用接口引用新创建的对象。 抽象工厂-

  • 本文向大家介绍Java设计模式编程之工厂方法模式的使用,包括了Java设计模式编程之工厂方法模式的使用的使用技巧和注意事项,需要的朋友参考一下 定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。 类型:创建类模式 类图: 工厂方法模式代码 工厂模式:         首先需要说一下工厂模式。工厂模式根据抽象程度的不同分为三种:简单工厂模式(也叫静态工

  • 本文向大家介绍详解C#设计模式编程中的模板方法模式使用,包括了详解C#设计模式编程中的模板方法模式使用的使用技巧和注意事项,需要的朋友参考一下 一、引言 提到模板,大家肯定不免想到生活中的“简历模板”、“论文模板”、“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载

  • 方案:- 我的测试数据是1)字符串A 2)字符串B 3)字符串C 现在我有了一个类,其中有数据提供者和工厂,数据提供者有3个值作为字符串 我想要的输出 A HelloA BYEA YESA B HelloB BYEB YESB C HelloC BYEC YESC

  • 本文向大家介绍Java设计模式之工厂模式(Factory模式)介绍,包括了Java设计模式之工厂模式(Factory模式)介绍的使用技巧和注意事项,需要的朋友参考一下 工厂模式定义:提供创建对象的接口。 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的