意图
创建复杂对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。定义一个创建对象的接口并实现,工厂模式使其创建过程延迟到实现类进行。
实现
Client.java
package cn.ac.nuc.factory;
import java.util.logging.Logger;
public class Client {
public static void main(String[] args) {
IFactory iFactory = new IFactory() {
};
Logger.getGlobal().info(String.format("%s", iFactory.getObject("CarFactory")));
Logger.getGlobal().info(String.format("%s", iFactory.getObject("AirFactory")));
Logger.getGlobal().info(String.format("%s", iFactory.getObject("OptFactory")));
}
}
IFactory.java
package cn.ac.nuc.factory;
import java.util.ServiceLoader;
public interface IFactory {
default Object getObject(String paramClz) {
ServiceLoader serviceLoader = ServiceLoader.load(IFactory.class);
for (var loader : serviceLoader) {
if (paramClz.equals(loader.getClass().getSimpleName()))
return loader.newObject().getName();
}
return newObject().getName();
}
default Product newObject() {
return new Product() {
};
}
}
interface Product {
default String getName() {
return "default";
}
// more methods
}
CarFactory.java
package cn.ac.nuc.factory;
public class CarFactory implements IFactory {
@Override
public Product newObject() {
// fold
return new Product() {
@Override
public String getName() {
return "car";
}
};
}
public CarFactory() {
}
}
通过 SPI 机制,将实现类注册到接口中。
meta-INF/services/cn.ac.nuc.factory.IFactory
cn.ac.nuc.factory.CarFactory



