一、介绍

工厂方法模式(Factory Pattern),是创建型设计模式之一。工厂方法模式是一种结构简单的模式,其在我们平时开发中应用很广泛,也许你并不知道,但是你已经使用了无数次该模式了,如Android中的Activity里的各个生命周期方法,以onCreate方法为例,它就可以看作是一个工厂方法,我们在其中可以构造我们的View并通过setContentView返回给framework处理等,相关内容我们下面再讲,先看看工厂方法模式定义。

二、定义

定义一个用于创建对象的接口,让子类决定实例化哪个类。

三、使用场景

在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。

四、模式的简单实现

抽象产品类:

public abstract class Product {/*** 产品类的抽象方法* 由具体的产品类去实现* */public abstract void method();
}

具体产品类A:

public class ConcreteProductA extends Product {@Overridepublic void method() {System.out.println("我是具体的产品A");}
}

具体产品类B:

public class ConcreteProductB extends Product {@Overridepublic void method() {System.out.println("我是具体的产品B");}
}

抽象工厂类:

public abstract class Factory {/*** 抽象工厂方法* 具体由子类实现* * @return 具体的产品对象* */public abstract Product createProduct();
}

具体工厂类:

public class ConcreteFactory extends Factory {/*** 具体工厂类* */@Overridepublic Product createProduct() {return new ConcreteProductA();}
}

客户类:

public class Client {public static void main(String[] args) {Factory factory = new ConcreteFactory();Product product = factory.createProduct();product.method();}
}

结果:

我是具体的产品A

这里的几个角色都很简单,主要分为四大模块,一是抽象工厂,其为工厂方法模式的核心;二是具体工厂,其实现了具体的业务逻辑;三是抽象产品,是工厂方法模式所创建的产品的父类;四是具体产品,为实现抽象产品的某个具体产品的对象。

上述的代码中我们在Client类中构造了一个工厂对象,并通过其生产了一个产品对象,这里我们得到的产品对象是ConcreteProductA的实例,如果想得到ConcreteProductB的实例,更改ConcreteFactory中的逻辑即可:

public class ConcreteFactory extends Factory {/*** 具体工厂类* */@Overridepublic Product createProduct() {//return new ConcreteProductA();return new ConcreteProductB();}
}

这种方式比较常见,需要哪一个产品就生产哪一个,有时候也可以利用反射的方式更简洁的来生产具体产品对象,此时,需要在工厂方法的参数列表中传入一个Class类来决定是哪一个产品类:

public abstract class Factory {/*** 抽象工厂方法* 具体由子类实现* * @param clz 产品对象类类型* * @return 具体的产品对象* */public abstract <T extends Product> T createProduct(Class<T> clz);
}

对于具体的工厂类,则通过反射获取类的示例即可:

public class ConcreteFactory extends Factory {/*** 具体工厂类* */@SuppressWarnings("unchecked")@Overridepublic <T extends Product> T createProduct(Class<T> clz) {Product product = null;try {product = (Product) Class.forName(clz.getName()).newInstance();} catch (Exception e) {e.printStackTrace();}return (T)product;}
}

最后在看看Client中的实现:

public class Client {public static void main(String[] args) {Factory factory = new ConcreteFactory();Product product = factory.createProduct(ConcreteProductB.class);product.method();}
}

需要哪一个类的对象就传入哪一个类的类型即可,这种方法比较简洁、动态,如果你不喜欢这种方式,也可以尝试为每一个产品都定义一个具体的工厂,各司其职。

public class ConcreteFactoryA extends Factory {/*** 具体工厂类**/@Overridepublic Product createProduct() {return new ConcreteProductA();}
}public class ConcreteFactoryB extends Factory {/*** 具体工厂类**/@Overridepublic Product createProduct() {return new ConcreteProductB();}
}public class Client {public static void main(String[] args) {Factory factoryA = new ConcreteFactoryA();Product productA = factoryA.createProduct();productA.method();Factory factoryB = new ConcreteFactoryB();Product productB = factoryB.createProduct();productB.method();}
}

像这样拥有多个工厂的方式我们称为多工厂方法模式,同样的,回到我们最初的那个工厂方法模式,当我们的工厂只有一个的时候,我们还是为工厂提供了一个抽象类,那么,我们是否可以将其简化掉呢?如果确定你的工厂类只有一个,那么简化掉抽象类是肯定没问题的,我们只需要将对应的工厂方法改为静态方法即可:

public class Factory {/*** 具体工厂类**/@Overridepublic static Product createProduct() {return new ConcreteProductA();}
}

像这样的方式又称为简单工厂模式或静态工厂模式,它是工厂方法模式的一个弱化版本。

其实到这里大家应该可以发现,工厂方法模式是完全符合设计原则的,其降低了对象之间的耦合度,而且,工厂方法模式依赖于抽象的架构,其将实例化的任务交由子类去完成,有非常好的扩展性。

五、Android源码中的工厂方法模式

  • Activity的各种生命周期

  • ArrayList和HashSet

六、总结

优点:

  • 工厂方法模式完全符合设计原则,降低了对象之间的耦合。高层模块只需要知道产品的抽象类,其他的实现都不需要关心。

  • 良好的封装性,代码结构清晰。扩展性好。

缺点:

  • 每次我们为工厂方法模式添加新的产品时就要编写一个新的产品类。同时还要引入抽象层,这必然会导致类结构的复杂化,所以,在某些情况比较简单时,是否要使用工厂模式,需要设计者权衡利弊了。

Android设计模式之——工厂方法模式相关推荐

  1. Android设计模式——抽象工厂方法模式

    1.抽象工厂方法模式:为了创建一组或相互依赖的对象提供一个接口,而不需要指定它们是具体类--无语 2.找个代码看看: 抽象工厂类<成员为接口> /*** 抽象工厂**/ public ab ...

  2. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  3. 设计模式复习-工厂方法模式

     设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...

  4. C#设计模式(3)——工厂方法模式

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  5. 设计模式之工厂方法模式(创建型)

    一.模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进行拓展,生产产品的过程由具体工厂类实现,基类只实现接口,这使得工厂方法模式可以在不修改 ...

  6. 设计模式之工厂方法模式应用例题

    设计模式之工厂方法模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReade ...

  7. 设计模式:工厂方法模式(Factory method)

    设计模式:工厂方法模式(Factory method) 一.问题 在前一章中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨. ...

  8. 【设计模式】工厂方法模式(C#)

    [设计模式]工厂方法模式 1.概述 针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则. 定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象.工厂方法使一个产品类的实例化 ...

  9. 一文叫你弄懂Java设计模式之工厂方法模式:图解+日志记录器代码实例

    文章目录 详解Java设计模式之工厂方法模式 案例引入工厂方法模式 工厂方法模式 定义 案例分析 UML类图分析 代码分析 工厂方法的重载 工厂方法的隐藏 模式优点 模式缺点 模式适用环境 详解Jav ...

最新文章

  1. Ubuntu 14.04 64位上安装wps office软件
  2. SpringBoot监听redis过期key
  3. 计算机丢失tlps,win7系统下PS提示计算机丢失tlpsplib10.dll文件的解决方法
  4. ios 自动打包命令_【实践】iOS使用Jenkins实现自动化打包并上传蒲公英
  5. 解密阿里云之飞天平台内核
  6. php中vc14是什么意思,VC9、VC11、VC14、VC15是啥?
  7. Tensorflow中PRelu实现细节
  8. 服务器上运行程序提示*工作已停止,已停止工作 出现了一个问题,导致程序停止正常工作。请关闭该程序...
  9. win10服务器网页打不开怎么办,win10系统浏览器网页打不开的解决技巧
  10. Windows下安装Tensorflow-Slim(待续)
  11. 利用JAVA的BFS爬虫爬出豆瓣读书的评论和标签
  12. Java并发基础知识,我用思维导图整理好了
  13. 大三升大四暑假找工作总结
  14. C程序设计语言(第2版)
  15. 截至2012年5月23日19点58分支持CUDA的NVIDIA的GPU列表(Geforce)
  16. 数组对头删除php,php学习 数组课件
  17. BuuCTF难题详解| Misc | [HDCTF2019]你能发现什么蛛丝马迹吗
  18. 整理一些es6的基础东西。记录成长
  19. LC并联谐振电路设计
  20. 如何从Android Studio手中救下你可怜的小C盘_莫韵乐与bug的奇幻冒险

热门文章

  1. synchronized原理_synchronized 底层原理与内存屏障
  2. 【转】ABP源码分析八:Logger集成
  3. java对象间的转型,详细讲述Java中的对象转型
  4. Python 数据分析三剑客之 Pandas(十):数据读写
  5. 【Python CheckiO 题解】Roman Numerals
  6. java 抽象类构造函数_抽象类可以有构造函数吗?
  7. 【LeetCode - 1765】. 地图中的最高点
  8. 【HDU - 3394】Railway(点双连通分量,Tarjan算法,思维tricks)
  9. 【POJ - 2377】Bad Cowtractors (最大生成树,并查集)
  10. 【POJ - 1269 】Intersecting Lines (计算几何,直线间的位置关系)