我目前正在对工厂设计模式进行一些研究,并列出了我对每种模式的理解的简要描述。如果有不正确的地方,请纠正我。
1) 工厂——简单,实际上不是正式的设计模式,通常是一个类,它有一个或多个方法(有时是静态的)接受一个参数,以确定要返回哪个抽象类型的子类。
2) 工厂方法——正式的模式,使用抽象工厂类。对于预期退货类型的每个产品,创建一个关联的factory类,并实现或重写所需的方法。在客户机代码中,虽然变量被声明为抽象工厂,但它是用具体实现实例化的。
3)抽象工厂-一种模式,通过各种相互关联或依赖的方法返回多种类型的对象。
我的问题是,我一直在使用共享方法的工厂(不是正式的模式)。然而,我正在考虑使用factory方法并使用它,但我无法弄清楚的是如何确定抽象factory类的哪个子类用于创建我的产品。据我目前所知,您仍然使用new关键字为声明为抽象工厂类的变量分配一个具体的类。
例如:
昏暗工厂1 As IFactory=New ConcreteFactory1
将工厂2的尺寸标注为IFactory=新混凝土工厂2
例如,如果我想根据数据库记录动态确定我想返回哪个IFactory,我将如何做到这一点?我最好让代码使用工厂模式而不使用工厂方法模式吗?我想避免在客户端代码中执行选择案例或if语句。我可以将工厂方法模式包装在工厂模式中吗?
希望我讲得通
嗯,这取决于你将使用的语言来支持设计的想法。我将在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程序系统可以说是随处可见。 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的