定义一个用于建立对象的接口,让子类决定实例化哪个类。Factory Method使一个类的实例化延迟到其子类java
虚构造器设计模式
Factory依赖于它的子类来实现工厂方法,因此它返回一个合适的ConcreteProduct实例。ide
/** * 产品抽象类 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/13 23:27 */ public abstract class Product { /** * 产品类的抽象方法,具体由子类去实现 */ public abstract void method(); } /** * 具体的产品类A * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/13 23:30 */ public class ProductA extends Product { @Override public void method() { System.out.println("我是具体的产品A"); } } /** * 具体的产品类B * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/13 23:30 */ public class ProductB extends Product { @Override public void method() { System.out.println("我是具体的产品B"); } } /** * 抽象工厂方法,具体生产什么由子类去实现 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/13 23:32 */ public abstract class Factory { /** * 生产具体的产品对象 * @return */ public abstract Product createProduct(); } /** * 具体工厂类 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/13 23:34 */ public class ConcreteFactory extends Factory { @Override public Product createProduct() { // 好比这里是建立一个产品A return new ProductA(); } } // 使用工厂方法的获得实例 public static void main(String[] args){ Factory factory = new ConcreteFactory(); Product product = factory.createProduct(); product.method(); }
执行结果:工具
我是具体的产品A
若是想要使用产品B,简单的方法是新建个ProductFactoryB类测试
/** * 具体工厂类 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/13 23:34 */ public class ProductBFactory extends Factory { @Override public Product createProduct() { return new ProductB(); } }
客户端使用ProductBFactory便可spa
每一个具体的Product都对应一个Factory类未免使得类文件太多了,能够试试Java的反射,把具体的对象的建立都放在一个createProduct方法中。设计
例子:代理
/** * 抽象工厂方法,具体生产什么由子类去实现 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/13 23:32 */ public abstract class Factory { /** * 生产具体的产品对象 * @param clz 具体产品的类名 * @param <T> * @return 具体产品实例 */ public abstract <T extends Product> T createProduct(Class<T> clz); } /** * 具体工厂类 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/13 23:34 */ public class ConcreteFactory extends Factory { @Override public <T extends Product> T createProduct(Class<T> clz) { Product product = null; try { product = (Product) Class.forName(clz.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return (T)product; } } // 测试 public static void main(String[] args){ Factory factory = new ConcreteFactory(); ProductA productA = factory.createProduct(ProductA.class); productA.method(); ProductB productB = factory.createProduct(ProductB.class); productB.method(); }
执行结果:code
我是具体的产品A 我是具体的产品B
若是具体工厂类只有一个,能够简化掉抽象工厂类,否则就是多工厂方法模式。对象
Android中数据持久化由多种方式,不外乎都是增删改查,咱们能够将每一种数据操做的方式做为一个产品类,在抽象产品类中定义操做的方法。