1.模式定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类
2.使用场景
1.当你不知道改使用对象的确切类型的时候
2.当你希望为库或框架提供扩展其内部组件的方法时
主要优点:
1.将具体产品和创建者解耦
2.符合单一职责原则
3.符合开闭原则
3.具体实现
3.1 代码示例
简单工厂:
// 简单工厂
class SimpleFactory {
public static Product createProduct(String type) {
if ("A".equals(type)) {
return new ProductA();
} else if ("B".equals(type)) {
return new ProductB();
} else {
return null;
}
}
}
工厂方法
// 工厂方法
abstract class ProductFactory {
/**
* 创建产品
*
* @return
*/
abstract Product createProduct();
public Product getObject() {
Product product = createProduct();
return product;
}
}
class NonCreateProductA extends ProductFactory {
@Override
Product createProduct() {
return new ProductA();
}
}
class NonCreateProductB extends ProductFactory {
@Override
Product createProduct() {
return new ProductB();
}
}
示例代码
// 实例代码
interface Product {
String getName();
}
class ProductA implements Product {
@Override
public String getName() {
return "Name's product A";
}
}
class ProductB implements Product {
@Override
public String getName() {
return "Name's product B";
}
}
测试代码
public class FactoryMethodTest {
public static void main(String[] args) {
// 简单工厂测试代码
Product simpleA = SimpleFactory.createProduct("A");
System.out.println(simpleA.getName());
Product simpleB = SimpleFactory.createProduct("B");
System.out.println(simpleB.getName());
// 工厂方法测试代码
Product pa = new NonCreateProductA().getObject();
System.out.println(pa.getName());
Product pb = new NonCreateProductB().getObject();
System.out.println(pb.getName());
}
}
3.2 源码中的应用
// java api
// 静态工厂方法
Calendar.getInstance()
java.text.NumberFormat.getInstance()
java.util.ResourceBundle.getBundle()
// 工厂方法
java.net.URLStreamHandlerFactory
javax.xml.bind.JAXBContext.createMarshaller