简单的对象可以直接通过new
创建就行,而复杂对象(比如创建对象时需要调用好几个方法时),在许多地方都需要创建时,就需要用到工厂模式了。同时,工厂模式可以实现解耦,高层不直接与产品实现类打交道。
基于依赖倒置原则,我们最好是面向接口编程。工厂方法模式首先需要两个接口:
// 工厂接口
public interface Factory {
Product create(String productName);
}
// 产品接口
public interface Product {
// methods
}
然后便是一系列的产品ProductA
、ProductB
...实现Product
接口。再写一个工厂实现类:
// 工厂实现类
public class FactoryA implements Factory {
@Override
public Product create(String productName) {
// 这里有几种实现逻辑,下午详解
return null;
}
}
// A产品实现类
public class ProductA implements Product {
}
// B产品实现类
public class ProductB implements Product {
}
我们看到,create
方法可以有几种实现逻辑:
// 使用简单的字符串和if判断
public Product create(String productName) {
if (productName == "A")
return new ProductA();
else if (productName == "B")
return new ProductB();
return null;
}
// 使用switch case
public Product create(String productName) {
switch (productName) {
case "A": return new ProductA();break;
case "B": return new ProductB();break;
default: return null;
}
}
// 使用反射
public Product create(String productName){
try {
Class cls = Class.forName("productName");
Product product = (Product) cls.newInstance();
return product;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
其中,最后一种通用性更强一点,如果加产品,也不用更改工厂类的代码。但实现较为复杂,且客户端需要传入类名,较为麻烦。
简单工厂模式如果只有一个工厂类,那可以不必使用一个工厂接口和一个工厂实现类。可以直接用一个具有静态方法create
的类。这种模式就是简单工厂模式。
在产品类较多,且产品创建过程十分复杂且多样化时,不宜把所有代码放在一个方法里。可以使用多个工厂实现类FactoryA
、FactoryB
...
在工厂类的静态块中通过反射初始化单例产品对象,通过create
方法返回该单例对象。
当一个产品对象被消费完成后,工厂类并不立即释放该对象,而是保持其初始状态,等待再次被使用。可以使用一个Map来缓存。注意进行并发控制。