定義一個用於建立對象的接口,讓子類決定實例化哪個類。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中數據持久化由多種方式,不外乎都是增刪改查,咱們能夠將每一種數據操做的方式做爲一個產品類,在抽象產品類中定義操做的方法。