




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在面向对象的编程中,工厂模式是一种经常被使用到的模式。根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。工厂模式的原理为了理解工厂模式是如果工作的,让我们来看一下图一:图1 工厂模式的工作原理在图1中,X是基类,Xy和Xz继承了X类。而工厂类能够根据程序传递给它的数据决定生成那一个子类的实例。在右边定义了一个getClass方法,该方法需要参数a并返回一个X类的实例。对于程序员来说,返回的究竟是Xy还是Xz的实例并不重要,因为它们有相同的方法,只不过这些方法的内部实现不同罢了。一个简单的例子在什么情况下会使用到工厂模式呢?让我们来看一个简单的例子。在一些网上的调查表中,经常要求填写姓名。有些人填写时姓放在前面,名放在后面(例如中国人填写姓名的习惯);而有些人填写时采用名,姓或者姓,名的格式(西方大多数文化中都这样填写姓名)。现在让我们假设通过判断姓名中是否包含了,和空格就可以判断到底是姓在前面还是名在前面。下面然我们先定义一个基类Namer:class Namer protected String last; /姓protected String first; /名public String getFirst() return first; public String getLast() return last; 在基类中我们将姓和名保存在两个不同的变量中,并且提供了getFirst()和getLast()方法。由于子类需要使用到保存姓名的变量,因此我们将它们设定为Protected。现在我们可以实现两个类来区分上面提到的两种情况。在WithoutComma类中,我们假设如果读入字符串中没有空格,则第一个字符是姓,剩下的字符是名;否者第一个空格之前是名,其后是姓:class WithoutComma extends Namer public WithoutComma(String s) int i = s.lastIndexOf( ); if (i 0) / 空格左边是名first = s.substring(0, i).trim();/ 空格右边是姓last =s.substring(i+1).trim();else / 没有空格,则第一个字符是姓,以后的字符是名last = s.substring(0,1); first = s.substring(1).trim(); 对于姓名中包含逗号的情况,代码如下。class WithComma extends Namer public WithComma (String s) int i = s.indexOf(,); if (i 0) / 逗号左边的是姓last = s.substring(0, i).trim();/ 都号右边的是名first = s.substring(i + 1).trim();else / 没有逗号,将字符串作为名,姓设为空last = s; first = ; 接下来就需要实现工厂类了。在工厂类中,我们只需要根据输入的名称中是否带有逗号来生成不同的类的实例。class NameFactory public Namer getNamer(String entry) int i = entry.indexOf(,); /检测是否存在,if (i0)return new WithComma(entry); elsereturn new WithoutComma (entry); 我们可已通过图二中的例子来看一看在程序中如何使用工厂类:图2 工厂模式测试程序在程序中,首先需要初始化工厂类:NameFactory nfactory = new NameFactory();然后当获得姓名按钮被按下以后,调用computeName()方法,而该方法又调用工厂类的getNamer()方法获得Namer的实例,并将姓和名显示在相应的文本框中:Namer nmr; nmr = nf.getNamer(jTextFieldName.getText(); jTextFieldFirstName.setText(nmr.getFirst(); jTextFieldLastName.setText(nmr.getLast();程序的源代码如下:public class Test extends javax.swing.JFrame private NameFactory nf; public Test() nf = new NameFactory(); initComponents(); private void initComponents() jPanel1 = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); jTextFieldName = new javax.swing.JTextField(); jPanel3 = new javax.swing.JPanel(); jPanel4 = new javax.swing.JPanel(); jLabel2 = new javax.swing.JLabel(); jTextFieldLastName = new javax.swing.JTextField(); jLabelFirstName = new javax.swing.JLabel(); jTextFieldFirstName = new javax.swing.JTextField(); jPanel5 = new javax.swing.JPanel(); jPanel6 = new javax.swing.JPanel(); jButtonCompute = new javax.swing.JButton(); jButtonClear = new javax.swing.JButton(); jButtonExit = new javax.swing.JButton(); setTitle(u5de5u5382u6a21u5f0fu6d4bu8bd5u7a0bu5e8f); addWindowListener(new java.awt.event.WindowAdapter() public void windowClosing(java.awt.event.WindowEvent evt) exitForm(evt); ); jPanel1.setLayout(new java.awt.GridLayout(5, 1); jPanel2.setLayout(new beans.lib.awtextra.AbsoluteLayout(); jLabel1.setText(u8f93u5165u59d3u540d); jPanel2.add(jLabel1, new beans.lib.awtextra.AbsoluteConstraints(50, 20, -1, -1);jTextFieldName.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jTextFieldNameActionPerformed(evt); ); jPanel2.add(jTextFieldName, new beans.lib.awtextra.AbsoluteConstraints(150, 10, 150, 40);jPanel1.add(jPanel2); jPanel1.add(jPanel3); jPanel4.setLayout(new java.awt.GridLayout(2, 2); jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel2.setText(u59d3:); jPanel4.add(jLabel2); jPanel4.add(jTextFieldLastName); jLabelFirstName.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabelFirstName.setText(u540d:); jLabelFirstName.setToolTipText(null); jPanel4.add(jLabelFirstName); jPanel4.add(jTextFieldFirstName); jPanel1.add(jPanel4); jPanel1.add(jPanel5); jButtonCompute.setText(u83b7u5f97u59d3u540d); jButtonCompute.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jButtonComputeActionPerformed(evt); ); jPanel6.add(jButtonCompute); jButtonClear.setText(u6e05u7a7a); jButtonClear.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jButtonClearActionPerformed(evt); ); jPanel6.add(jButtonClear); jButtonExit.setText(u9000u51fa); jButtonExit.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jButtonExitActionPerformed(evt); ); jPanel6.add(jButtonExit); jPanel1.add(jPanel6); getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); pack(); private void jButtonComputeActionPerformed(java.awt.event.ActionEvent evt) Namer nmr; nmr = nf.getNamer(jTextFieldName.getText(); jTextFieldFirstName.setText(nmr.getFirst(); jTextFieldLastName.setText(nmr.getLast(); private void jButtonExitActionPerformed(java.awt.event.ActionEvent evt) System.exit(0); private void jButtonClearActionPerformed(java.awt.event.ActionEvent evt) jTextFieldName.setText(); jTextFieldFirstName.setText(); jTextFieldLastName.setText(); private void jTextFieldNameActionPerformed(java.awt.event.ActionEvent evt) private void exitForm(java.awt.event.WindowEvent evt) System.exit(0); public static void main(String args) new Test().show(); private javax.swing.JPanel jPanel6; private javax.swing.JPanel jPanel5; private javax.swing.JButton jButtonExit; private javax.swing.JPanel jPanel4; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel1; private javax.swing.JButton jButtonClear; private javax.swing.JTextField jTextFieldName; private javax.swing.JTextFi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 路面工程勘察设计合同4篇
- 《中华人民共和国食品安全法》试题及答案
- 九月份工作计划怎么写(5篇)
- 警示教育心得体会怎么写(例文10篇)
- 执纪执法面试题目及答案
- 中小企业数字营销策略研究与实施
- 农业绿色发展2025政策导向:节水灌溉与水资源管理技术创新报告
- 农产品无损检测技术在农产品生产过程中的应用报告
- 2025年电气原理试题及答案
- 色彩构成试题及答案
- 文创产品国内外研究现状综述
- (正式版)JBT 9630.1-2024 汽轮机铸钢件无损检测 第1部分:磁粉检测
- 广州版初中英语词汇表
- 兽医法规课件
- 旅行社的产生与发展
- 幕墙吊装方案计算书
- 占道施工申请书怎么写范文
- 医院耗材SPD解决方案(技术方案)
- 《商务礼仪(第二版)》 课件 第一章 礼仪与商务礼仪
- 电厂常用英语词汇
- Android移动应用开发高职PPT完整全套教学课件
评论
0/150
提交评论