您现在的位置是:首页 > 文章详情

Android中的设计模式之工厂方法模式

日期:2018-08-11点击:283

参考

  • 《设计模式:可复用面向对象软件的基础 》3.3 Factory method 对象创建型模式
  • 《Android源码设计模式解析与实战》第5章 应用最广泛的模式--工厂方法模式

意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类

别名

虚构造器

适用性

  • 当一个类不知道它所必须创建的对象的类的时候
  • 当一个类希望由它的子类来指定它所创建的对象的时候
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

结构

结构

角色

  • Product 定义工厂方法所创建的对象的接口
  • ConcreteProduct 实现Product接口
  • Factory 声明工厂方法,该方法返回一个Product类型的对象,也可以定义一个默认实现,返回一个默认的ConcreteProduct对象
  • ConcreteFactory 重定义工厂方法以返回一个ConcreteProduct对象

协作

Factory依赖于它的子类来实现工厂方法,所以它返回一个合适的ConcreteProduct实例。

简单代码实现

/** * 产品抽象类 * @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即可

改进

每个具体的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(); } 

执行结果:

我是具体的产品A 我是具体的产品B 

简化

如果具体工厂类只有一个,可以简化掉抽象工厂类,不然就是多工厂方法模式。

应用例子1 List和Set中的iterator()方法

应用例子2 Android 组件中的onCreate,onCreateView这种方法

应用例子3 序列化工具 IOHandler

Android中数据持久化由多种方式,不外乎都是增删改查,我们可以将每一种数据操作的方式作为一个产品类,在抽象产品类中定义操作的方法。

结构图

结构图
原文链接:https://yq.aliyun.com/articles/628891
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章