定义:定义一个用于创建对象的接口,让子类决定实例化哪个类,工厂方法使一个类的实例化延迟到子类。
其通用格式为:
产品的接口
public interface Product {
void method();
}
具体产品
public class ConcreteProduct2 implements Product {
public void method() {
//具体处理
System.out.println("this is ConcreteProduct2");
}
}
public class ConcreteProduct1 implements Product {
public void method() {
//具体处理
System.out.println("this is ConcreteProduct1");
}
}
抽象工厂类
public abstract class Creator {
//创建Product
public abstract <T extends Product> T createProduct(Class<T> c);
}
具体工厂类
public class ConcreteCreator extends Creator {
public <T extends Product> T createProduct(Class<T> c) {
Product product = null;
try {
product = (Product) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
//异常处理
}
return (T) product;
}
}
场景类
public class Client {
public static void main(String[] args) {
Creator creator = new ConcreteCreator();
ConcreteProduct1 product = creator.createProduct(ConcreteProduct1.class);
// 具体业务处理
product.method();
}
}
优点
- 良好的封装性,代码结构清晰。创建产品只需要知道产品的类名即可,不用知道创建过程,降低模块间的耦合度。
- 易于扩展。增加产品时只需要创建产品实现接口即可。
- 屏蔽产品。产品类实现如何变化调用者不需要关心,只需要关心产品的接口,只要产品接口不变化,系统中的上层模块就不需要变化。