博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式--工厂方法模式(Factory Method Pattern)
阅读量:5957 次
发布时间:2019-06-19

本文共 1315 字,大约阅读时间需要 4 分钟。

定义

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

使用场景

  • 在任何需要生成复杂对象的地方,都可以使用工厂方法模式。
  • 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数

UML类图

简单工厂:

工厂方法:
  工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

使用反射实现工厂方法模式:

public abstract class Factory {    public abstract 
T createProduct(Class
clz);}public class ConcreteFactory extends Factory { @Override public
T createProduct(Class
clz) { Product p = null; try { p = (Product) Class.from(clz.getName()).newInstance(); } catch(Exception e) { } return (T) p; }}复制代码

优点

  • 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
  • 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,是因为所有的具体工厂类都具有同一抽象父类。
  • 使用工厂方法模式的另一个优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。

缺点

  • 在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
  • 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM(Document Object Model)、反射等技术,增加了系统的实现难度。

转载地址:http://rfgxx.baihongyu.com/

你可能感兴趣的文章
二进制翻译
查看>>
AOP和OOP的区别
查看>>
js中的 substring和substr方法
查看>>
wpf 界面加载 Command
查看>>
今 天看到我十年前的一篇技术文章,想到不知不觉学编程十多年了,,
查看>>
DOM(十四):代理检测和事件处理(跨浏览器)
查看>>
SqlServer存储过程调用接口
查看>>
ZOJ 3817Chinese Knot(The 2014 ACM-ICPC Asia Mudanjiang Regional First Round)
查看>>
一到十二月单词
查看>>
【算法】2 由股票收益问题再看分治算法和递归式
查看>>
Golang 笔记 2 函数、结构体、接口、指针
查看>>
Swift4 - 动态计算UITableView中tableHeaderView的高度 - 获取子控件高度和宽度
查看>>
java学习中,instanceof 关键字 和 final 关键字、值的传递(java 学习中的小记录)...
查看>>
数据结构 --- 线性表学习(php模拟)
查看>>
URAL 1081 Binary Lexicographic Sequence
查看>>
Codeforces 797B - Odd sum
查看>>
文章页调用栏目链接和栏目名称的方法
查看>>
Oracle数据库日期格式转换操作
查看>>
Play framework 2.0 -应用程序全局设置(转)
查看>>
如何将div高度填满剩余高度
查看>>