定义
在模板方法模式中,父类中规定了处理的流程,在子类中实现具体的处理,如果用该模式用来生成实例,则演变为工厂方法模式
在工厂方法模式中,父类决定实例的生成方法,但不决定所要生成的具体类,具体的处理全部交给子类负责,这样就可以将生成实例的框架和实际负责生成实例的类解耦
示例代码
生成实例的框架
Factory 类
定义了创建对象的生成方法,并不要求具体生成的类
public abstract class Factory {
// final 不能被重写
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 p);
}
产品类
所有产品的父类
/**
* 产品类
*/
public abstract class Product {
public abstract void use();
}
具体处理的子类
要继承Factory 类和 产品类,从而可以通过子类的工厂生成指定产品的子类,而生成子类的步骤已经在父类中指定好,即create()方法
IDCardFactory类
public class IDCardFactory extends Factory {
private List<String> owners = new ArrayList<>();
@Override
protected Product createProduct(String owner) {
IDCard idCard = new IDCard(owner);
return idCard;
}
@Override
protected void registerProduct(Product p) {
owners.add(((IDCard) p).getOwner());
}
public List<String> getOwners() {
return owners;
}
}
IDCard类
public class IDCard extends Product {
private String owner;
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;
}
}
总结
- 工厂方法模式主要是基于模板方法模式来生成子类,父类中实现了构造子类的方法,为子类附上特定的值(这是要靠我们在子类中的具体实现),从可以不断从子类factory中不断创建对象。
- 子类中要实现特殊的功能,尽量只改变子类中的代码,不要去动父类中的代码,因为父类中的代码相当于模板。