Java工厂模式用法之如何动态选择对象详解
工厂模式简介
在软件开发中经常需要创建对象,由于创建对象过程比较复杂,因此我们通常利用工厂模式来创建对象。工厂模式是指定义一个用于创建对象的接口(工厂接口),由实现这个接口的类(具体工厂)来创建具体的对象(产品)。在工厂模式中,客户端不直接 new 一个类的实例,而是通过工厂接口来创建实例,从而将实例的创建和使用代码解耦。
工厂模式的用法
工厂模式可以根据需要创建不同类型的对象,先定义一个工厂接口,根据不同的输入来返回不同的实例对象。
工厂接口
定义一个工厂接口:
public interface ProductFactory {
public Product create(String type);
}
这个工厂接口有一个 create 方法,输入一个 type,返回一个产品实例对象。这个工厂接口是用来抽象化具体工厂的,具体工厂通过继承这个工厂接口实现具体工厂类。
具体工厂
假设现在有两种产品,分别为 ProductA 和 ProductB。那么我们就可以分别创建 ProductAFactory 和 ProductBFactory 两个具体工厂来分别生产 ProductA 和 ProductB 两种产品。
// ProductAFactory.java
public class ProductAFactory implements ProductFactory {
public Product create(String type) {
if(type.equals("A")) {
return new ProductA();
}
return null;
}
}
// ProductBFactory.java
public class ProductBFactory implements ProductFactory {
public Product create(String type) {
if(type.equals("B")) {
return new ProductB();
}
return null;
}
}
这两个具体工厂实现了工厂接口,实现了 ProductFactory 中的 create 方法,当输入为 "A" 时,ProductAFactory 创建 ProductA 实例对象;当输入为 "B" 时,ProductBFactory 创建 ProductB 实例对象。
产品实现
具体的产品是由具体工厂来创建的,这里我们分别实现 ProductA 和 ProductB:
// ProductA.java
public class ProductA implements Product {
public void method() {
System.out.println("This is ProductA");
}
}
// ProductB.java
public class ProductB implements Product {
public void method() {
System.out.println("This is ProductB");
}
}
这两个产品实现了一个共同的接口 Product,这个接口定义了方法 method,具体产品实现这个方法。
调用示例
通过工厂模式,我们可以根据输入的 type 动态选择具体的 产品实现。这里有一个示例,根据输入的 type 来创建 ProductA 或 ProductB 对象:
public static void main(String[] args) {
String type = "A";
ProductFactory factory = null;
Product product = null;
if(type.equals("A")) {
factory = new ProductAFactory();
} else if(type.equals("B")) {
factory = new ProductBFactory();
}
product = factory.create(type);
if(product != null) {
product.method();
} else {
System.out.println("Invalid type!");
}
}
输入 type 为 "A" 时,创建 ProductA 实例对象并调用 method 方法输出 "This is ProductA",输入 type 为 "B" 时,创建 ProductB 实例对象并调用 method 方法输出 "This is ProductB"。如果输入的 type 不是 "A" 或 "B",则输出 "Invalid type!"。
示例2
我们继续以上面的工厂类为例,为了精简代码,这里我们使用反射来动态创建具体的工厂对象。
我们可以定义一个工厂类来统一实例化具体工厂类的对象,这样能够有效的减少代码量,并增加代码的灵活性。
工厂类
public class Factory {
public static ProductFactory createFactory(String className) {
try {
Class cls = Class.forName(className);
ProductFactory factory = (ProductFactory) cls.newInstance();
return factory;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
这个工厂类根据传进来的具体工厂类名(className),反射实例化具体工厂类对象,并返回一个 ProductFactory 接口类型对象。这样通过动态加载具体类,在代码中就可以通过字符串来动态创建具体的工厂实例。
调用示例
public static void main(String[] args) {
String className = "com.example.ProductAFactory";
String type = "A";
ProductFactory factory = Factory.createFactory(className);
Product product = factory.create(type);
if(product != null) {
product.method();
} else {
System.out.println("Invalid type!");
}
}
这个示例中,字符串 className 传入了具体工厂类的全路径名,通过反射创建具体的工厂对象,并通过 type 来创建具体的产品对象。这种方法可以在运行时动态选择具体类来实例化对象,非常灵活。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java工厂模式用法之如何动态选择对象详解 - Python技术站