用Template Method模式构建生成实例的工厂。
在factory method模式中,父类决定实例的生成方式,但是不决定所要生成的具体类,具体的处理交给子类负责。
角色:
Product产品:它定义了在Factory Method模式中的生成的那些实例所持有的接口,由Product类扮演。
Creator创建者:负责生成Product角色的抽象类,由Factory类扮演。
ConcreteProduct具体产品:决定具体的产品,由IDCard类扮演。
ConcreteCreator具体创建者:负责生成具体的产品,有IDCardFactory类扮演此角色。
优点:
提供统一实例工厂的框架。
框架与具体实现分开:可以根据不同产品类、创建不同的产品工厂,例如下面代码是IDCard产品与IDCardFactory产品工厂,也可以创建其他的产品和产品工厂。
框架:Product产品抽象类、Factory工厂抽象类
具体实现:IDCard产品类、IDCardFactory产品工厂类
代码:
public abstract class Factory { public final Product create(String owner) { Product product = createProduct(owner); register(product); return product; } public abstract Product createProduct(String owner); public abstract void register(Product product); }
public abstract class Product { public abstract void use(); }
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; } }
public class IDCardFactory extends Factory { List owners = new ArrayList<>(); @Override public Product createProduct(String owner) { return new IDCard(owner); } @Override public void register(Product product) { owners.add(((IDCard)product).getOwner()); } }
public class Main { public static void main(String[] args){ Factory factory = new IDCardFactory(); Product product1= factory.create("s1"); Product product2= factory.create("s2"); Product product3= factory.create("s3"); product1.use(); product2.use(); product3.use(); } }
执行结果:
创建s1的ID卡
创建s2的ID卡
创建s3的ID卡
使用s1的ID卡
使用s2的ID卡
使用s3的ID卡
代码说明:
Factory抽象类中的create方法定义了创建实例的流程,即调用方法的顺序,先调用createProduct创建产品,在调用register方法把创建的产品进行保存(保存在哪里由具体的工厂决定)。
Product抽象类中use方法定义了被工厂创建的实例中的使用方法,即use方法。(具体实例中方法不用,只起到测试作用,用于确认工厂确实可以创建实例并且调用到对应方法)
IDCardFactory类继承了Factory抽象类,定了createProduct和register方法的具体实现,把创建的实例保存到List集合中。