设计模式精讲-工厂方法模式
模式定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类。
实战说明
定义一个Product接口
//稳定的生产接口
interface Product{
public void method();
}
不同产品A,B各自实现该接口
//产品A
class ProductA implements Product{
@Override
public void method() {
System.out.println("ProductA method executed");
}
}
//产品B
class ProductB implements Product{
@Override
public void method() {
System.out.println("ProductB method executed");
}
}
简单工厂实现(不是设计模式)
//简单工厂
class SimpleFactory{
public static Product createProduct(String type){
if (type.equals("0")){
return new ProductA();
}else if(type.equals("1")){
return new ProductB();
}
else {
return null;
}
}
}
创用者,通过简单工厂创建对应产品,再执行产品对应的方法
public static void main(String[] args) {
Product product = SimpleFactory.createProduct("0");
product.method();
}
工厂方法
分析哪些是稳定不会变:要调用A,B中的方法,需要先把产品对象创建出来。
实施:抽象出来的创建产品方法createProduct,定义抽象类Application,getObject获取产品
abstract class Application{
abstract Product createProduct();
Product getObject(){
Product product = createProduct();
//.....
//....
//其他一系列业务处理,如数据填充
return product;
}
}
定义具体产品生产者ConcreteProductA,ConcreteProductB继承抽象类Application,实现抽象方法createProduct
class ConcreteProductA extends Application{
@Override
Product createProduct() {
return new ProductA();
}
}
class ConcreteProductB extends Application{
@Override
Product createProduct() {
return new ProductB();
}
}
调用
public class FactoryMethodTest {
public static void main(String[] args) {
Application application = new ConcreteProductB();
Product product = application.getObject();
product.method();
}
}
应用场景
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