来源:《设计模式之禅》java
定义:定义一个用于建立对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。web
抽象产品类Product定义产品共性,实现对事物最抽象的定义。设计模式
Creator定义抽象建立类,即抽象工厂。缓存
ConcreteCreator具体工厂,实现产品类的建立。框架
类图:ide
代码:测试
抽象工厂类:spa
/** * */ package cc.pattern.factory; /** * @author rico * 抽象建立者 */ public abstract class AbstractCreator { /** * 定义建立产品方法 * @param clazz * @return */ public abstract <T extends Product> T createProduct(Class<T> clazz); }
具体工厂类:设计
/** * */ package cc.pattern.factory; /** * @author rico * 具体工厂建立类 */ public class Creator extends AbstractCreator { /* (non-Javadoc) * @see cc.pattern.factory.AbstractCreater#createProduct(java.lang.Class) */ @Override public <T extends Product> T createProduct(Class<T> clazz) { Object product = null; try { product = Class.forName(clazz.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T)product; } }
抽象产品类:code
/** * */ package cc.pattern.factory; /** * @author rico * 抽象产品类 */ public abstract class Product { /** * 产品公共方法 */ public void commonMethod() { System.out.println("###Product.commonMethod..."); } /** * 产品抽象方法 */ public abstract void action(); }
具体产品类:
/** * */ package cc.pattern.factory; /** * @author rico * 具体产品类 */ public class ConcreteProduct extends Product { /* (non-Javadoc) * @see cc.pattern.factory.Product#action() */ @Override public void action() { System.out.println("###ConcreteProduct.action..."); } }
/** * */ package cc.pattern.factory; /** * @author rico * 具体产品类 */ public class ConcreteProduct2 extends Product { /* (non-Javadoc) * @see cc.pattern.factory.Product#action() */ @Override public void action() { System.out.println("###ConcreteProduct2.action..."); } }
场景类:
/** * */ package cc.pattern.factory; /** * @author rico * 场景类 */ public class Client { /** * @param args */ public static void main(String[] args) { AbstractCreator creator = new Creator(); Product product1 = creator.createProduct(ConcreteProduct.class); product1.action(); Product product2 = creator.createProduct(ConcreteProduct2.class); product2.action(); } }
工厂方法模式优势:
良好的封装性,代码结构清晰。
良好的扩展性。
屏蔽产品类。产品接口保持不变,上次模块就不会发生变化。
典型的解耦框架。
工厂方法模式缺点:
使用场景:
工厂方法模式是new一个对象的替代品,能够用于生产须要的对象,可是须要考虑是否要添加一个工厂类,增长代码的复杂度。
须要灵活,可扩展的框架时。定义一个工厂方法,根据传入的条件生存对应的对象。
工厂方法模式能够用于异构项目中。
能够使用在测试驱动开发框架下。
扩展:
缩小为简单工厂模式,去掉抽象工厂类,并把建立产品的方法定义为静态方法。
升级为多个工厂类,为每一个产品定义一个建立者,由调用者决定选择哪一个产品建立者。
代替单例模式。
延迟初始化。工厂负责对象的建立,而且经过Map保存一个缓存。