工厂方法模式

76 阅读1分钟

定义

在模板方法模式中,父类中规定了处理的流程,在子类中实现具体的处理,如果用该模式用来生成实例,则演变为工厂方法模式

在工厂方法模式中,父类决定实例的生成方法,但不决定所要生成的具体类,具体的处理全部交给子类负责,这样就可以将生成实例的框架实际负责生成实例的类解耦

示例代码

生成实例的框架

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;
    }
}

总结

  1. 工厂方法模式主要是基于模板方法模式来生成子类,父类中实现了构造子类的方法,为子类附上特定的值(这是要靠我们在子类中的具体实现),从可以不断从子类factory中不断创建对象。
  2. 子类中要实现特殊的功能,尽量只改变子类中的代码,不要去动父类中的代码,因为父类中的代码相当于模板。