在上一章,模板模式中,我们在父类规定处理的流程,在子类中实现具体的处理。如果我们将该模式用于生成实例,便演变成了Factory模式,即工厂模式。
在Factory模式中,父类决定实例的生成方式,但并不决定所要生成的具体的类,具体处理全部交给子类进行。
设计实例则是模仿Spring框架进行的操作,模拟制作身份证。为了模拟Spring框架解耦,我们采用分包的方法,即生成实例的框架放在framework包中,而加工处理,具体实现的类放在具体实现的idcard包中。
- framework包中的product类,用于表示产品这一类东西,定义了一个use抽象方法
package site.wangxin520.gof.factory.framework; /** * 仿spring框架,定义的一个工厂类生产的产品类 * @author wangXgnaw * */ public abstract class Product { /** * 定义一个顶层抽象方法,用于框架中工厂生产的产品,具体实现交给子类 */ public abstract void use(); }
- framework包中的Factory类
package site.wangxin520.gof.factory.framework; /** * 仿spring框架,建立一个Factory工厂,定义三个方法,具体实现交给子类完成。 * 这里采用的是模板方法 * @author wangXgnaw * */ public abstract class Factory { /** * 使用模板方法,具体创建product的实现交给子类 * @param owner 产品所有者姓名 * @return Product */ protected abstract Product createProduct(String owner); /** * 注册product * @param product */ protected abstract void registerProduct(Product product); /** * 创建product对象的模板方法 * @param owner 产品所有者姓名 * @return Product */ public final Product create(String owner){ Product p=createProduct(owner); registerProduct(p); return p; } }
- idcard包中的IDCard类
package site.wangxin520.gof.factory.idcard; import site.wangxin520.gof.factory.framework.Product; /** * 身份证的实体类 * @author wangXgnaw * */ public class IDCard extends Product{ /** * 隐藏IDCard的构造函数,拒绝外部包访问,外部包只能通过工厂模式进行访问 */ IDCard() { } //IDCard的属性 private String owner; public String getOwner() { return owner; } public void setOwner(String owner) { this.owner = owner; } @Override public void use() { System.out.println(owner+"使用了身份证"); } }
- idcard包中的IDCardFactory类
package site.wangxin520.gof.factory.idcard; import java.security.acl.Owner; import java.util.ArrayList; import java.util.List; import site.wangxin520.gof.factory.framework.Factory; import site.wangxin520.gof.factory.framework.Product; /** * 创建身份证的工厂 * @author wangXgnaw * */ public class IDCardFactory extends Factory { //记录登记创建了的产品信息,貌似如果是单例模式的话,就可以直接从这里取值了,最好是map结构(猜测) private List<Product> createdProduct=new ArrayList<Product>(); @Override protected Product createProduct(String owner) { IDCard idCard=new IDCard(); idCard.setOwner(owner); System.out.println("创建了"+owner+"的身份证"); return idCard; } @Override protected void registerProduct(Product product) { createdProduct.add(product); } }
- 具体测试类
package site.wangxin520.gof.factory.idcard; import site.wangxin520.gof.factory.framework.Factory; import site.wangxin520.gof.factory.framework.Product; /** * 测试工厂类 * @author wangXgnaw * */ public class FactoryTest { public static void main(String[] args) { Factory factory=new IDCardFactory(); Product p1 = factory.create("葵司"); Product p2 = factory.create("上原亚衣"); Product p3 = factory.create("古川伊织"); p1.use(); p2.use(); p3.use(); } }
- 最终控制台输出结果为