GOF设计模式——Factory Method模式
一、什么是Factory Method模式
Factory Method模式是用来构建生成实例的工厂,在该模式下,父类决定实例生成的方式,但并不决定所要生成的具体类。这样的设计思想,就跟Template Method模式相似(具体参考:https://www.cnblogs.com/SysoCjs/p/10327088.html或者https://blog.csdn.net/weixin_39400271/article/details/86565016),因为Factory Method模式就是建立在Template Method模式的基础上,前者是决定实例的生成方式,而后者则是决定方法的执行流程。
二、Factory Method模式思想
Product:一个抽象类,属于框架的一部分。里面定义了在Factory Method模式下生成的实现所拥有的接口(API);
Creator:负责生成Product角色的抽象类,也是属于框架的一部分;
ConcreteProduct:决定了具体的产品;
ConcreteCreator:负责生成具体的产品类。
三、具体例子
假设要设计一个IDCard的工厂类,用来“制造”很多很多的IDCard。
1、Factory类
package com.cjs.factoryMethod;
public abstract class Factory {
public final Product create(String owner) {
Product product = createProduct(owner);
registerProduct(product);
return product;
}
//Factory类只知道下面两个方法的作用,至于它们是怎么做的,Factory类不知道,也不关心,具体实现交给相应的子类
protected abstract Product createProduct(String owner);//调用此方法,生成产品(类对象)
protected abstract void registerProduct(Product product);//调用此方法,注册产品(类对象)
}
Factory抽象类定义了两个抽象方法:createProduct和registerProduct,分别用于创建产品和注册产品;另外,还定义了一个final修饰的方法,里面设定了一些处理流程,这也就是Template Method模式的设计思想。
2、Product类
package com.cjs.factoryMethod;
public abstract class Product {
public abstract void use();
}
3、IDCardFactory类
package com.cjs.factoryMethod;
import java.util.*;
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());
}
}
继承了Factory抽象类,实现了createProduct方法和registerProduct方法,换句话说,只要继承了Factory类,就具有“工厂”的制造功能。
4、IDCard类
package com.cjs.factoryMethod;
public class IDCard extends Product {
private String owner;
public 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;
}
}
5、Main类
package com.cjs.factoryMethod;
public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
IDCard idCard1 = (IDCard) factory.create("张三");
IDCard idCard2 = (IDCard) factory.create("李四");
IDCard idCard3 = (IDCard) factory.create("王五");
idCard1.use();
idCard2.use();
idCard3.use();
}
}
输出信息:
四、Factory Method模式的优点
如果现在有一个新需求,要给每一个人制做一个工牌,那么,只要编写一个EmployeeCardFactory类,继承Factory类,并实现两个抽象方法,那么EmployeeCardFactory类就具有“工厂”的功能。请注意,这里并没有修改任何关于模板框架的内容,就可以创建出其他的“工厂”和“产品”。