版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在面向对象的编程中,工厂模式是一种经常被使用到的模式。根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。工厂模式的原理为了理解工厂模式是如果工作的,让我们来看一下图一图1工厂模式的工作原理在图1中,X是基类,Xy和Xz继承了X类。而工厂类能够根据程序传递给它的数据决定生成那一个子类的实例。在右边定义了一个getClass方法,该方法需要参数a并返回一个X类的实例。对于程序员来说,返回的究竟是Xy还是Xz的实例并不重要,因为它们有相同的方法,只不过这些方法的内部实现不同罢了。一个简单的例子在什么情况下会使用到工厂模式呢?让我们来看一个简单的例子。在一些网上的调查表中,经常要求填写姓名。有些人填写时姓放在前面,名放在后面(例如中国人填写姓名的习惯);而有些人填写时采用"名,姓"或者"姓,名"的格式(西方大多数文化中都这样填写姓名)。现在让我们假设通过判断姓名中是否包含了","和空格就可以判断到底是姓在前面还是名在前面。下面然我们先定义一个基类Namer:classNamer{protectedStringlast;//姓protectedStringfirst;//名publicStringgetFirst(){returnfirst;}publicStringgetLast(){returnlast;}}在基类中我们将姓和名保存在两个不同的变量中,并且提供了getFirst()和getLast()方法。由于子类需要使用到保存姓名的变量,因此我们将它们设定为Protected。现在我们可以实现两个类来区分上面提到的两种情况。在WithoutComma类中,我们假设如果读入字符串中没有空格,则第一个字符是姓,剩下的字符是名;否者第一个空格之前是名,其后是姓:classWithoutCommaextendsNamer{publicWithoutComma(Strings){inti二s.lastlndexOf(“");if(i>0){//空格左边是名first二s.substring(0,i).trim();//空格右边是姓last二s.substring(i+l).trim();}else{//没有空格,则第一个字符是姓,以后的字符是名last二s.substring(0,l);first二s.substring(l).trim();}}}对于姓名中包含逗号的情况,代码如下。classWithCommaextendsNamer{publicWithComma(Strings){inti二s.indexOf(",");if(i>0){//逗号左边的是姓last二s.substring(0,i).trim();//都号右边的是名first二s.substring(i+l).trim();}else{//没有逗号,将字符串作为名,姓设为空last二s;first二"“;}}}接下来就需要实现工厂类了。在工厂类中,我们只需要根据输入的名称中是否带有逗号来生成不同的类的实例。classNameFactory{publicNamergetNamer(Stringentry){inti=entry.indexOf(",");//检测是否存在",‘if(i>0)returnnewWithComma(entry);elsereturnnewWithoutComma(entry);}}我们可已通过图二中的例子来看一看在程序中如何使用工厂类:图2工厂模式测试程序在程序中,首先需要初始化工厂类:NameFactorynfactory=newNameFactory();然后当"获得姓名"按钮被按下以后,调用computeName()方法,而该方法又调用工厂类的getNamer()方法获得Namer的实例,并将姓和名显示在相应的文本框中:Namernmr;nmr=nf.getNamer(jTextFieldName.getText());jTextFieldFirstName.setText(nmr.getFirst());jTextFieldLastName.setText(nmr.getLast());程序的源代码如下:publicclassTestextendsjavax.swing.JFrame{privateNameFactorynf;publicTest(){nf=newNameFactory();initComponents();}privatevoidinitComponents(){jPanell=newjavax.swing.JPanel();jPanel2=newjavax.swing.JPanel();jLabell=newjavax.swing.JLabel();jTextFieldName=newjavax.swing.JTextField();jPanel3=newjavax.swing.JPanel();jPanel4=newjavax.swing.JPanel();jLabel2=newjavax.swing.JLabel();jTextFieldLastName=newjavax.swing.JTextField();jLabelFirstName=newjavax.swing.JLabel();jTextFieldFirstName=newjavax.swing.JTextField();jPanel5=newjavax.swing.JPanel();jPanel6=newjavax.swing.JPanel();jButtonCompute=newjavax.swing.JButton();jButtonClear=newjavax.swing.JButton();jButtonExit二newjavax.swing.JButton();setTitle("\u5de5\u5382\u6a21\u5f0f\u6d4b\u8bd5\u7a0b\u5e8f");
addWindowListener(newjava.awt.event.WindowAdapter(){publicvoidwindowClosing(java.awt.event.WindowEventevt){exitForm(evt);}});jPanel1.setLayout(newjava.awt.GridLayout(5,1));jPanel2.setLayout(neworg.netbeans.lib.awtextra.AbsoluteLayout());jLabell.setText("\u8f93\u5165\u59d3\u540d");jPanel2.add(jLabell,neworg.netbeans.lib.awtextra.AbsoluteConstraints(50,20,-1,-1));jTextFieldName.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEventevt){jTextFieldNameActionPerformed(evt);}});jPanel2.add(jTextFieldName,neworg.netbeans.lib.awtextra.AbsoluteConstraints(150,10,150,40));jPanel1.add(jPanel2);jPanell.add(jPanel3);jPanel4.setLayout(newjava.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);jPanell.add(jPanel4);jPanell.add(jPanel5);jButtonCompute.setText("\u83b7\u5f97\u59d3\u540d");jButtonCompute.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEventevt){jButtonComputeActionPerformed(evt);}});jPanel6.add(jButtonCompute);jButtonClear.setText("\u6e05\u7a7a");jButtonClear.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEventevt){jButtonClearActionPerformed(evt);}});jPanel6.add(jButtonClear);jButtonExit.setText("\u9000\u51fa");jButtonExit.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEventevt){jButtonExitActionPerformed(evt);}});jPanel6.add(jButtonExit);jPanell.add(jPanel6);getContentPane().add(jPanell,java.awt.BorderLayout.CENTER);pack();}privatevoidjButtonComputeActionPerformed(java.awt.event.ActionEventevt){Namernmr;nmr=nf.getNamer(jTextFieldName.getText());jTextFieldFirstName.setText(nmr.getFirst());jTextFieldLastName.setText(nmr.getLast());}privatevoidjButtonExitActionPerformed(java.awt.event.ActionEventevt){System.exit(0);}privatevoidjButtonClearActionPerformed(java.awt.event.ActionEventevt){jTextFieldName.setText("");jTextFieldFirstName.setText("");jTextFieldLastName.setText("");}privatevoidjTextFieldNameActionPerformed(java.awt.event.ActionEventevt){}privatevoidexitForm(java.awt.event.WindowEventevt){System.exit(0);}publicstaticvoidmain(Stringargs[]){newTest().show();}privatejavax.swing.JPaneljPanel6;privatejavax.swing.JPaneljPanel5;privatejavax.swing.JButtonjButtonExit;privatejavax.swing.JPaneljPanel4;privatejavax.swing.JPaneljPanel3;privatejavax.swing.JPaneljPanel2;privatejavax.swing.JPaneljPanell;privatejavax.swing.JButtonjButtonClear;privatejavax.swing.JTextField
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版闭门会议与会人员保密义务合同3篇
- 2025年度服装服饰配送与销售服务合同4篇
- 2025年昆山法院判决:退物业费标准及执行合同范本3篇
- 样板间装修工程2025版维护保养合同2篇
- 2025年厂房及设备租赁与绿色能源服务合同4篇
- 2025年度个人金融服务股权无偿转让协议书4篇
- 二零二五版绿色办公用品耗材定制生产合同2篇
- 二零二五版智能社区电缆敷设与智慧家庭解决方案合同3篇
- 汕头二零二五年度商务咨询合同
- 二零二五年度石油化工企业消防安全评估与改进合同2篇
- 漆画漆艺 第三章
- CB/T 615-1995船底吸入格栅
- 光伏逆变器一课件
- 货物供应、运输、包装说明方案
- (完整版)英语高频词汇800词
- 《基础马来语》课程标准(高职)
- IEC61850研讨交流之四-服务影射
- 《儿科学》新生儿窒息课件
- 材料力学压杆稳定
- 人教版小升初英语知识点汇总
- 静态爆破专项施工方案
评论
0/150
提交评论