Design Pattern: Factory Method 模式

简介:

  学习是分享和合作式的!

转载请注明出处:http://blog.csdn.net/wdzxl198/article/details/9223275; 

文章摘自: http://www.riabook.cn/doc/designpattern/; 

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

FactoryMethod

AbstractEditor中的createDocument()方法是个抽象方法,因为框架不知道您将实现一个什么类型的文件,这个抽象方法将推迟至继承AbstractEditor的子类中实现。
这个架构可用以下简单的示意程式来作示范,当中实现了一个RTFDocument,虽然在AbstractEditor中并不知道我们会套用这个RTFDocument,但您可以看到,透过多型操作,您的框架可以进行对文件的相关操作。

  • AbstractEditor.java
   1: public abstract class AbstractEditor {
   2:     private IDocument document;
   3:     public abstract IDocument createDocument();
   4:  
   5:     public void newDocument() { 
   6:         document = createDocument(); 
   7:         document.open();
   8:     }
   9:  
  10:     public void saveDocument() { 
  11:         if(document != null) 
  12:             document.save(); 
  13:     }
  14:  
  15:     public void closeDocument() { 
  16:         if(document != null) 
  17:             document.close(); 
  18:     }
  19: } 
  • IDocument.java
   1: public interface IDocument {
   2:     public void open();
   3:     public void save();
   4:     public void close();
   5: } 
  • RTFEditor.java
 
 
   1: public class RTFEditor extends AbstractEditor { 
   2:     public IDocument createDocument() { 
   3:         return new RTFDocument(); 
   4:     } 
   5: } 

  • RTFDocument.java
   1: public class RTFDocument implements IDocument {
   2:     public RTFDocument() { 
   3:         System.out.println("建立RTF文件"); 
   4:     }
   5:  
   6:     public void open() { 
   7:         System.out.println("开启文件"); 
   8:     }
   9:  
  10:     public void save() { 
  11:         System.out.println("储存文件"); 
  12:     }
  13:  
  14:     public void close() { 
  15:         System.out.println("关闭文件"); 
  16:     }
  17: }
将Factory Method的结构绘出如下:

FactoryMethod

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

目录
相关文章
|
开发工具 git
Gitlab/GitHub:迁移代码,并保留历史记录
Gitlab/GitHub:迁移代码,并保留历史记录
Gitlab/GitHub:迁移代码,并保留历史记录
|
SQL 分布式计算 数据挖掘
Hive SQL初级练习(30题)
Hive SQL初级练习(30题)
|
存储 缓存 Linux
【实战指南】嵌入式RPC框架设计实践:六大核心类构建高效RPC框架
在先前的文章基础上,本文讨论如何通过分层封装提升一个针对嵌入式Linux的RPC框架的易用性。设计包括自动服务注册、高性能通信、泛型序列化和简洁API。框架分为6个关键类:BindingHub、SharedRingBuffer、Parcel、Binder、IBinder和BindInterface。BindingHub负责服务注册,SharedRingBuffer实现高效数据传输,Parcel处理序列化,而Binder和IBinder分别用于服务端和客户端交互。BindInterface提供简单的初始化接口,简化应用集成。测试案例展示了客户端和服务端的交互,验证了RPC功能的有效性。
758 78
|
12月前
|
存储 监控 安全
实时记录和查看Apache 日志
Apache 是一个开源、跨平台的Web服务器,保护其安全依赖于监控活动和分析访问日志。日志分为访问日志和错误日志,前者记录用户请求及响应情况,后者记录服务器错误信息。EventLog Analyzer等工具可集中收集、分析日志,提供直观的仪表板和实时警报,帮助识别趋势、异常和威胁,确保服务器稳定性和安全性,并支持合规管理。
317 5
|
设计模式 算法 Java
16.迭代器模式设计思想
本文详细介绍了迭代器模式的设计思想、原理、结构及应用场景,通过Java代码示例解析了迭代器模式的具体实现过程,并讨论了其优缺点及适用环境。迭代器模式通过提供统一的遍历接口,简化了集合对象的访问,支持多种遍历方式,同时保持了良好的封装性和灵活性。文章还提供了丰富的资源链接,帮助读者深入理解和应用设计模式。
202 7
|
10月前
|
关系型数据库 MySQL 数据库
Docker下Mysql8数据备份与恢复
通过以上步骤,您可以在Docker环境下高效地备份和恢复MySQL 8数据库。备份数据时,使用 `mysqldump`工具生成逻辑备份文件,并存储到指定目录;恢复数据时,使用 `mysql`工具从备份文件中读取数据并恢复到数据库。自动化脚本和定时任务的配置可以进一步简化备份和恢复的管理过程。
832 41
|
机器学习/深度学习 算法 知识图谱
【机器学习】逻辑回归原理(极大似然估计,逻辑函数Sigmod函数模型详解!!!)
【机器学习】逻辑回归原理(极大似然估计,逻辑函数Sigmod函数模型详解!!!)
|
JavaScript 前端开发
VUE3v-text、v-html、:style的理解
VUE3v-text、v-html、:style的理解
730 2
|
安全 Go 数据库
「有问必答」秒杀系统 Go并发编程实践!
「有问必答」秒杀系统 Go并发编程实践!
305 2
|
分布式计算 Hadoop 大数据
基于Docker搭建大数据集群(三)Hadoop部署
基于Docker搭建大数据集群(三)Hadoop部署