模式概念
这是工厂模式中比较简单的一种,大致思想和上篇提到的《java设计模式——TemplateMethod模式》 比较像。首先我们看一个图,这个图来自《图解设计模式》一书响应章节:
图中,提供了一个生产鱼的模具,然后我们可以使用不同的材料生产颜色,质感不一样的鱼,这个图很好地解释了工厂方法模式。
在Template Method模式中,我们在父类中规定处理流程,在子类中实现具体的细节。如果我们将该模式用于实例的生成,那么它就是Factory Method模式了。
Factory就是工厂的意思,也就是规模化,标准化生产对象实例的地方。用Template Method模式来构建生成的工厂,这就是FactoryMethod模式。
在FactoryMethod模式中,父类决定实例的生成方式,但是不决定需要生成什么类型的实例,具体的处理全部交给子类来负责。这样就可以将生成实例的框架和需要实现的业务细节解耦。
举个例子
我们这里举一个生产id卡的例子,主要用于生产每个人的ID卡。一共有5个类:
AbstractProduct类和AbstractFactory类属于framework包,提供实例生成的框架。
IDCard类和IDCardFactory类是负责实际生产的类,他们在idcard的包下。
Main类是客户端类。
这里涉及的类图如下:
代码整体的包结构如下:
下面我们看下具体的实现。
AbstractProduct
/*************************************************************************
> File Name: AbstractProduct.java
> Author: CreateChance
> Mail: createchance@163.com
> Created Time: Thu Mar 15 10:19:14 2018
************************************************************************/
package framework;
public abstract class AbstractProduct {
public abstract void use();
}
AbstractFactory
/*************************************************************************
> File Name: AbstractFactory.java
> Author: CreateChance
> Mail: createchance@163.com
> Created Time: Thu Mar 15 11:52:57 2018
************************************************************************/
package framework;
public abstract class AbstractFactory {
public final AbstractProduct create(String owner) {
AbstractProduct product = createProduct(owner);
registerProduct(product);
return product;
}
protected abstract AbstractProduct createProduct(String owner);
protected abstract void registerProduct(AbstractProduct product);
}
IDCard
/*************************************************************************
> File Name: IDCard.java
> Author: CreateChance
> Mail: createchance@163.com
> Created Time: Thu Mar 15 11:56:19 2018
************************************************************************/
package idcard;
import framework.*;
public class IDCard extends AbstractProduct {
private String owner;
IDCard(String owner) {
System.out.println("Creating id card, owner: " + owner);
this.owner = owner;
}
@Override
public void use() {
System.out.println("Using id card, owner: " + owner);
}
public String getOwner() {
return owner;
}
}
IDCardFactory
/*************************************************************************
> File Name: IDCardFactory.java
> Author: CreateChance
> Mail: createchance@163.com
> Created Time: Thu Mar 15 12:28:07 2018
************************************************************************/
package idcard;
import framework.*;
import java.util.List;
import java.util.ArrayList;
public class IDCardFactory extends AbstractFactory {
private List<String> owners = new ArrayList<>();
@Override
protected AbstractProduct createProduct(String owner) {
return new IDCard(owner);
}
@Override
protected void registerProduct(AbstractProduct product) {
owners.add(((IDCard) product).getOwner());
}
public List<String> getOwners() {
return owners;
}
}
Main
/*************************************************************************
> File Name: Main.java
> Author: CreateChance
> Mail: createchance@163.com
> Created Time: Thu Mar 15 12:35:22 2018
************************************************************************/
import framework.*;
import idcard.*;
public class Main {
public static void main(String[] argvs) {
AbstractFactory factory = new IDCardFactory();
AbstractProduct card1 = factory.create("Tom");
AbstractProduct card2 = factory.create("Jack");
AbstractProduct card3 = factory.create("Jimmy");
card1.use();
card2.use();
card3.use();
}
}
运行结果
模式角色
在FactoryMethod模式中涉及的角色如下图: