博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Design Pattern: Factory Method 模式
阅读量:6295 次
发布时间:2019-06-22

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

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

考虑一个状况,您所经营的工厂正在生产一个新的电视机产品,现在有一个问题发生了,您的电视机产品所有的组件都可以自行生产,像是操作面版、电源、摇控装置等等等,但荧幕却必须依赖另一个厂商或子厂商供应,这时您怎么办? 

您不能将生产进度停下了,相反的您必须确定一些事情,您知道有关于荧幕控制的所有介面,您可以将这些对介面的操作沟通先实现,等到荧幕到了,直接将荧幕与您的半成品组合起来,一个完整的成品即可出厂。 
Factory Method模式在一个抽象类中留下某个创建元件的抽象方法没有实作,其它与元件操作相关联的方法都先依赖于元件所定义的介面,而不是依赖于元件的实现, 当您的成品中有一个或多个元件无法确定时,您先确定与这些元件的操作介面,然后用元件的抽象操作介面先完成其它的工作,元件的实作(实现)则推迟至实现元 件介面的子类完成,一旦元件加入,即可完成您的成品。 
再举一个例子,假设您要完成一个文件编辑器,您希望这个编辑器可以适用于所有类型的档案编辑,例如RTF、DOC、TXT等等,尽管这些文件有着不同的格 式,您先确定的是这些文件必然具备的一些操作介面,例如储存、开启、关闭等等,您用一个IDocument类型来进行操作,这么一来这个框架就无需考虑实 际的储存、开启等细节是如何进行的。 
以 UML 类别图来表现以下的概念:

FactoryMethod

AbstractEditor中的createDocument()方法是个抽象方法,因为框架不知道您将实现一个什么类型的文件,这个抽象方法将推迟至继承AbstractEditor的子类中实现。 

这个架构可用以下简单的示意程式来作示范,当中实现了一个RTFDocument,虽然在AbstractEditor中并不知道我们会套用这个RTFDocument,但您可以看到,透过多型操作,您的框架可以进行对文件的相关操作。

  • AbstractEditor.java

public abstract class AbstractEditor {    private IDocument document;    public abstract IDocument createDocument();    public void newDocument() {         document = createDocument();         document.open();    }    public void saveDocument() {         if(document != null)             document.save();     }    public void closeDocument() {         if(document != null)             document.close();     }}

IDocument.java

public interface IDocument {    public void open();    public void save();    public void close();}

RTFEditor.java

public class RTFEditor extends AbstractEditor {     public IDocument createDocument() {         return new RTFDocument();     } }

RTFDocument.java

public class RTFDocument implements IDocument {    public RTFDocument() {         System.out.println("建立RTF文件");     }    public void open() {         System.out.println("开启文件");     }    public void save() {         System.out.println("储存文件");     }    public void close() {         System.out.println("关闭文件");     }}

将Factory Method的结构绘出如下:

FactoryMethod

Factory Method中的AbstractOperator中拥有一个抽象的factoryMethod()方法,它负责生成一个IProduct类型的物件,由 于目前还不知道将如何实现这个类型,所以将之推迟至子类别中实现,在AbstractOperator中先实现IProduct操作介面沟通的部份,只要 介面统一了,利用多型操作即可完成各种不同的IProduct类型之物件操作。 

也就是说,对AbstractOperator来说,其操作的IProduct是可以抽换的。

==============================================================================
本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/04/23/2466973.html,如需转载请自行联系原作者
你可能感兴趣的文章
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>
阿里感悟(十八)- 应届生Review
查看>>
话说模式匹配(5) for表达式中的模式匹配
查看>>
《锋利的SQL(第2版)》——1.7 常用函数
查看>>
jquery中hover()的用法。简单粗暴
查看>>
线程管理(六)等待线程的终结
查看>>
spring boot集成mongodb最简单版
查看>>
DELL EqualLogic PS存储数据恢复全过程整理
查看>>
《Node.js入门经典》一2.3 安装模块
查看>>
《Java 开发从入门到精通》—— 2.5 技术解惑
查看>>
Linux 性能诊断 perf使用指南
查看>>
实操分享:看看小白我如何第一次搭建阿里云windows服务器(Tomcat+Mysql)
查看>>
Sphinx 配置文件说明
查看>>
数据结构实践——顺序表应用
查看>>
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>