工厂方法模式的定义:
Define an interface for creating an object,but let subclasses decide which class to instaniate.Factory Method lets a class defer instantiation to subclasses.
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法让一个类的实例化延迟到其子类。与简单工厂方法模式相比,在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是具体创建的工作交给子类去做。这个核心类成为了一个抽象工厂类,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
下面是工厂方法模式的示例代码。代码所在的包名为“工厂方法模式”。
Product.java:
package 工厂方法模式;
/**
* 抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
* @author AHAN
*
*/
public abstract class Product {
//抽象方法
public abstract void method();
}
Creator.java:
package 工厂方法模式;
/**
* 抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。
* @author AHAN
*
*/
public abstract class Creator {
//创建一个产品对象,其输入参数类型可自行设置
//通常为String、Enum、Class等,当然也可以为空
public abstract <T extends Product> Product FactoryMethod(Class<T> c);
}
ConcreteProduct.java:
package 工厂方法模式;
/**
* 具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
* @author AHAN
*
*/
public class ConcreteProduct extends Product {
@Override
public void method() {
System.out.println("这是具体产品的方法");
}
}
ConcreteCreator.java:
package 工厂方法模式;
/**
* 具体工厂(Concrete
* Creator)角色:担任这个角色的是实现了抽象工厂接口的具体JAVA类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
*
* @author AHAN
*
*/
public class ConcreteCreator extends Creator {
@Override
public <T extends Product> Product FactoryMethod(Class<T> c) {
try {
Product product = (Product) Class.forName(c.getName())
.newInstance();
return product;
} catch (Exception e) {
// 异常处理
return null;
}
}
}
Client.java:
package 工厂方法模式;
/**
* 客户端
* @author AHAN
*
*/
public class Client {
public static void main(String[] args) {
Creator creator = new ConcreteCreator();
Product product = creator.FactoryMethod(ConcreteProduct.class);
product.method();
}
}
可以根据情况升级为多个工厂类。