定义
- 使用Template Method模式用于生成实例,就演变为Factory Method模式。
Factory Method模式中的登场角色
- Product(产品)
- Creator(创建者)
- ConcreteProduct(具体的产品)
- ConcreteCreator(具体的创建者)
Factory Method模式的类图
拓展思路的要点
- 框架与具体加工。工厂和产品(框架)与具体工厂和具体产品(具体加工)在不同的包内。使用相同的框架就可以创建出其他的“产品”和“工厂”。框架不依赖于具体加工。
- 生成实例——方法的三种实现方式。这里指的是抽象工厂类中生成产品的create()方法:
- 指定其为抽象方法,具体工厂必须要实现该方法。
- 为其实现默认处理,但这时产品是用new关键字创建出来实例的,因此不能讲产品Product定义为抽象类。
- 在其中抛出异常,子类如果没有重写该方法,程序在运行时会出错。
- 使用模式与开发人员之间的沟通。在使用设计模式设计类时,必须要向未来维护的开发人员正确传达设计的意图,可以添加详细注释。
相关的设计模式
Factory Method模式是Template Method的典型应用。
- Singleton模式(第5章)
在多数情况下我们都可以将Singleton模式用于扮演Creator角色(或是ConcreteCreator角色)的类。这是因为在程序中没有必要存在多个Creator角色(或是ConcreteCreator角色)的实例。
- Composite模式(第11章)
有时可以将Composite模式用于Product角色(或是ConcreteProduct角色)。
有时,在Iterator模式中使用iterator方法生成Iterator的实例时会使用Factory Method模式。
代码
- Product(产品)
package framework;
public interface Product {
void use();
void setName(String name);
}
- Creator(创建者)
package framework;
public abstract class Factory {
public final Product create(String owner, String number) {
// Template的典型应用
Product p = createProduct(owner, number);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner, String number);
protected abstract void registerProduct(Product product);
}
- ConcreteProduct(具体的产品)
package idcard;
import framework.Product;
public class IDCard implements Product {
private String owner;
private String number;
IDCard(String owner, String number) {
System.out.println("制作" + owner + "的ID卡,卡编号为" + number);
this.owner = owner;
this.number = number;
}
@Override
public void use() {
System.out.println("使用" + owner + "的ID卡,卡编号为" + number);
}
public String getOwner() {
return owner;
}
public String getNumber() {
return number;
}
@Override
public void setName(String name) {
// TODO
}
}
- ConcreteCreator(具体的创建者)
package idcard;
import java.util.HashMap;
import java.util.Map;
import framework.Factory;
import framework.Product;
public class IDCardFactory extends Factory {
private Map<String, String> owners = new HashMap<String, String>();
@Override
protected Product createProduct(String owner, String number) {
return new IDCard(owner, number);
}
@Override
protected void registerProduct(Product product) {
String owner = ((IDCard) product).getOwner();
String number = ((IDCard) product).getNumber();
owners.put(owner, number);
}
public Map<String, String> getOwners() {
return owners;
}
}
- 调用者
import java.util.Map;
import framework.Factory;
import framework.Product;
import idcard.IDCardFactory;
public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.create("小明", "1");
Product card2 = factory.create("小红", "2");
Product card3 = factory.create("小刚", "3");
card1.use();
card2.use();
card3.use();
if (factory instanceof IDCardFactory) {
Map<String, String> owner = ((IDCardFactory) factory).getOwners();
owner.forEach((n, m) -> {
System.out.println(n + " " + m);
});
}
}
}
注:博客中的图片来自网上。