在Factory Method模式中,父类决定实例的生成方式,但比不决定所要生成的具体的类,具体的处理全部交给子类去处理。这样就可以生成实例的框架(framework)和负责生产实例的类解耦
工厂方法的类图:

说明:
- Creator(创建者)属于框架这一方,负责生成Product的抽象类
- Product(产品)属于框架这一方,它定义了工厂方法模式中生成的那些实例所持有的接口(API)
- ConcreteCreator和ConcreteProduct分别是具体的创建者和具体的产品
来一段代码:
这是一个关于制作身份证的小demo
- Factory和Product类属于framework包,这两个类是用于组成实例的框架
- IDCardFactory和IDCard两个类负责加工处理,属于idcard包
- 类图:

package designPattern.factory.factoryMethod.framework;
/**
* 创建者,交给子类去完成
*/
public abstract class Factory {
public final Product create(String owner){
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product product);
}
package designPattern.factory.factoryMethod.framework;
/**
* 产品,它定义的是Factory Method模式中生成的实例所持有的接口
*/
public abstract class Product {
public abstract void use();
}
package designPattern.factory.factoryMethod.idcard;
import designPattern.factory.factoryMethod.framework.Factory;
import designPattern.factory.factoryMethod.framework.Product;
import java.util.ArrayList;
import java.util.List;
/**
* 属于具体加工的这一方,它负责生成具体的产品
*/
public class IDCardFactory extends Factory {
private List owners = new ArrayList();
@Override
protected Product createProduct(String owner) {
return new IDCard(owner);
}
@Override
protected void registerProduct(Product product) {
owners.add(((IDCard)product).getOwner());
}
public List getOwners(){
return owners;
}
}
package designPattern.factory.factoryMethod.idcard;
import designPattern.factory.factoryMethod.framework.Product;
/**
* 属于具体的加工这一方,它决定了具体的产品
*/
public class IDCard extends Product {
private String owner;
/**
* 创建一个构造函数
* @param owner
*/
public IDCard(String owner) {
System.out.println("制作" + owner + "的ID卡");
this.owner = owner;
}
@Override
public void use() {
System.out.println("使用" + owner + "的ID卡");
}
public String getOwner(){
return owner;
}
}
测试:
package designPattern.factory.factoryMethod;
import designPattern.factory.factoryMethod.framework.Factory;
import designPattern.factory.factoryMethod.framework.Product;
import designPattern.factory.factoryMethod.idcard.IDCardFactory;
import java.util.List;
public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.create("Mike");
Product card2 = factory.create("Joe");
card1.use();
card2.use();
}
}
/**
* 打印的结果
* 制作Mike的ID卡
* 制作Joe的ID卡
* 使用Mike的ID卡
* 使用Joe的ID卡
*/