定义
工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
类图
角色
1. 抽象工厂 Creator:这是工厂方法的核心,在实际的系统中这个角色也常常使用抽象类实现
2. 具体工厂 Concrete Creator:
3. 抽象产品 Product
4. 具体产品 ConcreteProduct
示例:简单工厂到工厂方法的演变
简单工厂:
//抽象产品
interface Product{}
//具体产品
class ProductA implements Product{}
class ProductB implements Product{}
//产品工厂(下一步就是它的进化,就变成了工厂方法模式)
public class ProductFactory {
private ProductFactory(){}
public static Product getProduct(String productName){
if (productName.equals("A")) {
return new ProductA();
}else if (productName.equals("B")) {
return new ProductB();
}else {
return null;
}
}
}
工厂方法:
//抽象产品
interface Product{}
//具体产品
class ProductA implements Product{}
class ProductB implements Product{}
//将简单工厂中的工厂给抽象成接口
interface Factory{
Product getProduct();
}
//具体的工厂A,创造产品A
class FactoryA implements Factory{
public Product getProduct() {
return new ProductA();
}
}
//具体的工厂B,创造产品B
class FactoryB implements Factory{
public Product getProduct() {
return new ProductB();
}
}
可以看到,产品部分并没有变化,只是将简单工厂中的工厂类抽象成接口,并给相应产品添加相应的工厂类,就进化成了工厂方法模式。
JDBC的API 与 Collection的ArrayList和HashSet也是工厂方法的一种应用,详见转载连接,真正做项目的过程当中很少用到工厂方法模式,这个模式更多的是帮助我们理解现有的开源项目,就像现在,你是不是对JDBC的大体框架有了一定认识了呢,如果你不知道这个模式,可能看源码会觉得一头雾水呢。
规则只是用来指导你的,不是用来限制你的,只要设计合理,你的设计就是规则!