Factory Method
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory
Method 使得一个类的实例化延迟到子类
class?SimpleFactory?{
public?static?Product?createProdcut(String?type)?{
if?(type.equals(?"0"?))?{
return?new?ProductA();
}?else?if?(type.equals(?"1"?))?{
return?new?ProductA1();
}?else?{
return?null;
}
?}
}
//?稳定接口
interface?Product?{
?public?void?method1();
}
//?具体实现
class?ProductA?implements?Product?{
?public?void?method1()?{
?System.out.println(?"ProductA.method1?executed.?"?);
?}
}
class?ProductA1?implements?Product?{
?public?void?method1()?{
?System.out.println(?"ProductA1.method1?executed.?"?);
?}
}
abstract?class?Application?{
?abstract?Product?createProduct();
?Product?getObject()?{
?Product?product=createProduct();
?//?...
?//?...
?return?product;
?}
}
//?工厂方法具体实现类
class?ConcreteProductA?extends?Application?{
?@Override
?Product?createProduct()?{
?//?....
?return?new?ProductA();
?}
}
class?ConcreteProductA1?extends?Application?{
?@Override
?Product?createProduct()?{
?//...
?return?new?ProductA1();
?}
}
1.当你不知道改使用对象的确切类型的时候
2.当你希望为库或框架提供扩展其内部组件的方法时
主要优点:
1.将具体产品和创建者解耦
2.符合单一职责原则
3.符合开闭原则
//?java?api
//?静态工厂方法
Calendar.getInstance()
java.text.NumberFormat.getInstance()
java.util.ResourceBundle.getBundle()
//?工厂方法
?java.net.URLStreamHandlerFactory
javax.xml.bind.JAXBContext.createMarshaller
??????????????????????????????????????????????????????????????????