⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 factorymethod.htm

📁 程式设计是思维具体化的一种方式
💻 HTM
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>


  
  
  <link rel="stylesheet" href="css/stdlayout.css" type="text/css">


  
  
  <link rel="stylesheet" href="css/print.css" type="text/css">


  
  
  <meta content="text/html; charset=gb2312" http-equiv="content-type">


  
  
  <title>Factory Method 模式</title>
</head>


<body>


<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>


<h1><a href="CppGossip.html">Design Pattern:&nbsp;Factory Method 模式</a></h1>


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


<br>


以 UML 类别图来表现以下的概念: <br>
<div style="text-align: center;"><img style="width: 565px; height: 357px;" alt="FactoryMethod" title="FactoryMethod" src="images/factoryMethod-1.jpg"><br>
</div>
<br>
AbstractEditor中的createDocument()方法是个抽象方法,因为框架不知道您将实现一个什么类型的文件,这个抽象方法将推迟至继承AbstractEditor的子类中实现。<br>
<br>
这个架构可用以下简单的示意程式来作示范,当中实现了一个RTFDocument,虽然在AbstractEditor中并不知道我们会套用这个RTFDocument,但您可以看到,透过多型操作,您的框架可以进行对文件的相关操作。<br>
<ul>
  <li> AbstractEditor.java
  </li>
</ul>

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

<br>

<ul>
  <li> IDocument.java
  </li>
</ul>

<pre>public interface IDocument {<br>    public void open();<br>    public void save();<br>    public void close();<br>} <br></pre>

<br>

<ul>
  <li> RTFEditor.java
  </li>
</ul>

<pre>public class RTFEditor extends AbstractEditor { <br>    public IDocument createDocument() { <br>        return new RTFDocument(); <br>    } <br>}                <br></pre>

<br>

<ul>
  <li> RTFDocument.java
  </li>
</ul>

<pre>public class RTFDocument implements IDocument {<br>    public RTFDocument() { <br>        System.out.println("建立RTF文件"); <br>    }<br><br>    public void open() { <br>        System.out.println("开启文件"); <br>    }<br><br>    public void save() { <br>        System.out.println("储存文件"); <br>    }<br><br>    public void close() { <br>        System.out.println("关闭文件"); <br>    }<br>}</pre>
<br>
将Factory Method的结构绘出如下:<br>
<div style="text-align: center;"><img style="width: 585px; height: 357px;" alt="FactoryMethod" title="FactoryMethod" src="images/factoryMethod-2.jpg"><br>
</div>
<br>
Factory
Method中的AbstractOperator中拥有一个抽象的factoryMethod()方法,它负责生成一个IProduct类型的物件,由
于目前还不知道将如何实现这个类型,所以将之推迟至子类别中实现,在AbstractOperator中先实现IProduct操作介面沟通的部份,只要
介面统一了,利用多型操作即可完成各种不同的IProduct类型之物件操作。<br>
<br>
也就是说,对AbstractOperator来说,其操作的IProduct是可以抽换的。<br>
<br>


</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -