1、什么是工厂模式

在上一节的模块方法设计模式(交给子类)中,模式中,将方法的具体实现交给了子类,而父类只负责规定处理的流程,父类充当生成的框架。而在工厂模式跟模块方法设计模式很像,我们的父类,规定了生成新的实例的流程而子类实现了具体生成哪个类。

2、理解与实现

思考:实现ID卡对象,必须有use方法使用该ID卡,卡需要创建和姓名注册才能使用。

我们可能很熟悉以下代码

public class IDcard(){
//IDcard
    private String owner;
    public IDcard(String owner){
	this.owner = owner;
    }
    public void use(){
	System.out.println("使用 " + owner + "的ID卡");
    }
    public String getOwner(){
	reeturn owner;
    }
}
public class Main(){
    public static void main(String []args){
        List owners = new ArrayList();
	IDcard idcard1 = new IDcard("小明");
	owners.add(idcard1.getOwner);
	idcard1.use();

	IDcard idcard2 = new IDcard("小红");
	owners.add(idcard2.getOwner);
	idcard2.use();

	IDcard idcard3 = new IDcard("小刚");
	owners.add(idcard3.getOwner);
	idcard3.use();
    }
}

这就实现了一个创建新的ID卡来使用,并将小明、小红、小刚的名字注册。

然而大家有没有想过,当我们需要生成的对象不同而功能单一时,或者生成很多个而生成实例的流程大致相同时,要怎么办?

我们就要增加很多的new IDcard和owners.add的代码。这会使代码看上去非常笨重。而且如果创建智能卡的流程改变的话,我们需要更改许多的代码。

如果我们使用模块方法来设计一个工厂类,工厂类存放创建ID卡的流程的方法。那么我们在修改创建流程的时候,只需要修改工厂类就可以了。

我们来看看更高级的设计的设计流程:

因为创建任何卡必须要有use方法,将use单独设置一个产品的抽象类让ID卡对象类来重写这个use方法。

工厂中定义了注册的所有过程,也提供了实现这些注册过程中的具体实现的抽象类。智能卡创建工厂继承工厂抽象类,并重写工厂类中的抽象方法来完善具体创建智能卡需要的每个步骤的方法。

类名作用
Product定义use抽象类
Factory实现create方法抽象类
IDCard实现use方法类
IDCardFactory实现createProduct、registerProduct方法类
Factory_Method程序入口
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);
}
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;
    }
}
public abstract class Product  {
    public abstract void use();
}
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;
    }
}
public class Factory_Method {
    public static void main(String []args){
        Factory factory = new IDCardFactory();
        Product card1 = factory.create("小明");
        Product card2 = factory.create("小红");
        Product card3 = factory.create("小刚");
        card1.use();
        card2.use();
        card3.use();
    }
}

在这个程序中,需要创建ID卡和注册,直接使用ID卡工厂中的create方法来实现创建一张新卡。就算创建了很多的实例,但如果需要增加一个增加卡号的流程,只需要在Factory类中增加几行代码即可,不需要将所有生成实例的代码都增加一遍。

而如果我们这个时候需要一个车辆工厂(创建车辆和注册车辆),只需要类似IDCardFactory将create和register以不同的处理方式重写。

输出结果是与我们第一个程序的结果是相同的,减少了在调用时的代码的冗余和修改的灵活性。