﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-helloworld-随笔分类-java - 模式</title><link>http://www.blogjava.net/zhaochengming/category/24907.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Aug 2007 13:37:37 GMT</lastBuildDate><pubDate>Mon, 13 Aug 2007 13:37:37 GMT</pubDate><ttl>60</ttl><item><title>建造模式--JavaMail发送邮件（多语言无乱码)</title><link>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136481.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 13 Aug 2007 10:58:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136481.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/136481.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/136481.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/136481.html</trackback:ping><description><![CDATA[<p><strong>&lt;1&gt;IMail 接口</strong></p>
<p>import java.io.File;<br>import java.util.Date;<br>import java.util.List;</p>
<p>import javax.mail.BodyPart;</p>
<p>public interface IMail {<br>public void set主题(String 主题);<br>public void setText(String Text);<br>public void setCotnent(BodyPart content);<br>public void set发件人(Email地址 发件人);<br>public void set收件人(List&lt;Email地址&gt; 收件人);<br>public void set抄送人(List&lt;Email地址&gt; 抄送人);<br>public void set暗送人(List&lt;Email地址&gt; 暗送人);<br>public void set邮件时间(Date time);<br>public void set附件(List&lt;File&gt; files);<br>public Email地址 get发件人();<br>public List&lt;Email地址&gt; get收件人();<br>public List&lt;Email地址&gt; get抄送人();<br>public List&lt;Email地址&gt; get暗送人();<br>public List&lt;File&gt; get附件();<br>public Date get邮件时间();<br>public String get主题();<br>public String getText();<br>public BodyPart getContent();<br>}</p>
<p><strong>&lt;2&gt;Mail类</strong><br>import java.io.File;<br>import java.util.Date;<br>import java.util.List;</p>
<p>import javax.mail.BodyPart;</p>
<p>public class Mail implements IMail{<br>private Email地址 发件人;<br>private String 主题;<br>private String text;<br>private BodyPart content;<br>private List&lt;Email地址&gt; 抄送人;<br>private List&lt;Email地址&gt; 收件人;<br>private List&lt;Email地址&gt; 暗送人;<br>private Date 邮件时间 ;<br>private List&lt;File&gt; 附件;</p>
<p>public Email地址 get发件人() {<br>&nbsp;&nbsp;&nbsp; return this.发件人;<br>}</p>
<p>public List&lt;Email地址&gt; get抄送人() {<br>&nbsp;&nbsp;&nbsp; return this.抄送人;<br>}</p>
<p>public List&lt;Email地址&gt; get收件人() {<br>&nbsp;&nbsp;&nbsp; return this.收件人;<br>}</p>
<p>public List&lt;Email地址&gt; get暗送人() {<br>&nbsp;&nbsp;&nbsp; return this.暗送人;<br>}</p>
<p>public Date get邮件时间() {<br>&nbsp;&nbsp;&nbsp; return this.邮件时间;<br>}</p>
<p>public List&lt;File&gt; get附件() {<br>&nbsp;&nbsp;&nbsp; return this.附件;<br>}</p>
<p>public void set发件人(Email地址 发件人) {<br>&nbsp;&nbsp;&nbsp; this.发件人 = 发件人;<br>}</p>
<p>public void set抄送人(List&lt;Email地址&gt; 抄送人) {<br>&nbsp;&nbsp;&nbsp; this.抄送人 = 抄送人; <br>}</p>
<p>public void set收件人(List&lt;Email地址&gt; 收件人) {<br>&nbsp;&nbsp;&nbsp; this.收件人 = 收件人;<br>}</p>
<p>public void set暗送人(List&lt;Email地址&gt; 暗送人) {<br>&nbsp;&nbsp;&nbsp; this.暗送人 = 暗送人;<br>}</p>
<p>public void set邮件时间(Date time) {<br>&nbsp;&nbsp;&nbsp; this.邮件时间 = time;<br>}</p>
<p>public void set附件(List&lt;File&gt; files) {<br>&nbsp;&nbsp;&nbsp; this.附件 = files;<br>}</p>
<p>public BodyPart getContent() {<br>&nbsp;&nbsp;&nbsp; return this.content; <br>}</p>
<p>public String getText() {<br>&nbsp;&nbsp;&nbsp; return this.text;<br>}</p>
<p>public String get主题() {<br>&nbsp;&nbsp;&nbsp; return this.主题;<br>}</p>
<p>public void setCotnent(BodyPart content) {<br>&nbsp;&nbsp;&nbsp; this.content = content;<br>}</p>
<p>public void setText(String text) {<br>&nbsp;&nbsp;&nbsp; this.text = text;<br>}</p>
<p>public void set主题(String 主题) {<br>&nbsp;&nbsp;&nbsp; this.主题 = 主题;<br>}<br>}<br><br><strong>&lt;3&gt;Abstract邮件发送服务器</strong><br>import java.io.File;<br>import java.util.Date;<br>import java.util.List;</p>
<p>import javax.activation.DataHandler;<br>import javax.activation.DataSource;<br>import javax.activation.FileDataSource;<br>import javax.mail.BodyPart;<br>import javax.mail.Message;<br>import javax.mail.Multipart;<br>import javax.mail.Session;<br>import javax.mail.internet.InternetAddress;<br>import javax.mail.internet.MimeBodyPart;<br>import javax.mail.internet.MimeMessage;<br>import javax.mail.internet.MimeMultipart;<br>import javax.mail.internet.MimeUtility;</p>
<p>public abstract class Abstract邮件发送服务器 {<br>protected IMail 邮件;<br>protected Session session;<br>protected String send方式;<br><br>public Abstract邮件发送服务器() {<br>&nbsp;&nbsp;<br>}<br><br>protected InternetAddress[] getAddressByType(List&lt;Email地址&gt; list) throws Exception {<br>&nbsp;&nbsp;&nbsp; if (list != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp; InternetAddress address[] = new InternetAddress[list.size()];<br>&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0 ; i &lt; list.size(); i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address[i] = list.get(i).toInternetAddress();<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; return address;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return null;<br>}<br>public void 发送邮件() {<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp; MimeMessage message = new MimeMessage(session);<br>&nbsp;&nbsp;&nbsp;&nbsp; Multipart multipart = new MimeMultipart();<br>&nbsp;&nbsp;&nbsp;&nbsp; message.setSubject(邮件.get主题(),"utf-8");<br>&nbsp;&nbsp;&nbsp;&nbsp; if(邮件.getText() != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.setText(邮件.getText(),"utf-8");<br>&nbsp;&nbsp;&nbsp;&nbsp; message.setSentDate(邮件.get邮件时间()==null?new Date():this.邮件.get邮件时间());<br>&nbsp;&nbsp;&nbsp;&nbsp; multipart.addBodyPart(this.邮件.getContent());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; //添加发件人<br>&nbsp;&nbsp;&nbsp;&nbsp; message.setFrom(邮件.get发件人().toInternetAddress());<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; //添加收件人<br>&nbsp;&nbsp;&nbsp;&nbsp; InternetAddress address[] = this.getAddressByType(this.邮件.get收件人());<br>&nbsp;&nbsp;&nbsp;&nbsp; if (address != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.addRecipients(Message.RecipientType.TO,address);<br>&nbsp;&nbsp;&nbsp;&nbsp; //添加抄送人<br>&nbsp;&nbsp;&nbsp;&nbsp; address = this.getAddressByType(this.邮件.get抄送人());<br>&nbsp;&nbsp;&nbsp;&nbsp; if (address != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.addRecipients(Message.RecipientType.CC,address);<br>&nbsp;&nbsp;&nbsp;&nbsp; //添加暗送人<br>&nbsp;&nbsp;&nbsp;&nbsp; address = this.getAddressByType(this.邮件.get暗送人());<br>&nbsp;&nbsp;&nbsp;&nbsp; if (address != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.addRecipients(Message.RecipientType.BCC,address);<br>&nbsp;&nbsp;&nbsp;&nbsp; //添加附件<br>&nbsp;&nbsp;&nbsp;&nbsp; if (this.邮件.get附件() != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; this.邮件.get附件().size(); i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File file = this.邮件.get附件().get(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BodyPart messageBodyPart = new MimeBodyPart();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSource source = new FileDataSource(file);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; messageBodyPart.setDataHandler(new DataHandler(source));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; messageBodyPart.setFileName(MimeUtility.encodeWord(file.getName(),"UTF-8","Q")); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart.addBodyPart(messageBodyPart);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; message.setContent(multipart);<br>&nbsp;&nbsp;&nbsp;&nbsp; if(send方式 == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send方式 = "smtp";<br>&nbsp;&nbsp;&nbsp;&nbsp; session.getTransport(send方式).send(message);<br>&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>public Session&nbsp;&nbsp;&nbsp; getSession() {<br>&nbsp;&nbsp;&nbsp; return session;<br>}<br>public void setSession(Session session) {<br>&nbsp;&nbsp;&nbsp; this.session = session;<br>}<br>public IMail get邮件() {<br>&nbsp;&nbsp;&nbsp; return 邮件;<br>}<br>public void set邮件(IMail 邮件) {<br>&nbsp;&nbsp;&nbsp; this.邮件 = 邮件;<br>} <br><br>}<br><br><strong>&lt;4&gt;Abstract发送邮件建造者</strong><br>import javax.mail.Session;</p>
<p><br>public abstract class Abstract发送邮件建造者 {<br>protected Abstract邮件发送服务器 mailServer;<br><br>public Abstract发送邮件建造者() {<br>&nbsp;&nbsp;<br>}<br><br>public abstract void 建造邮件(IMail mail);<br><br>public abstract void 建造邮件session(Session session);<br><br>public void 建造发送邮件() {<br>&nbsp;&nbsp;&nbsp; this.mailServer.发送邮件();<br>}<br>}<br><br><strong>&lt;5&gt;Smtp邮件发送服务器</strong><br>public class Smtp邮件发送服务器 extends Abstract邮件发送服务器 {<br>public Smtp邮件发送服务器() {<br>&nbsp;&nbsp;&nbsp; this.send方式 = "smtp";<br>}<br>}</p>
<p><strong>&lt;6&gt;Smtp发送邮件建造者</strong><br>import java.util.Properties;</p>
<p>import javax.mail.Session;</p>
<p><br>public class Smtp发送邮件建造者 extends Abstract发送邮件建造者 {<br>public Smtp发送邮件建造者() {<br>&nbsp;&nbsp;&nbsp; this.mailServer = new Smtp邮件发送服务器(); <br>}</p>
<p>@Override<br>public void 建造邮件(IMail mail) {<br>&nbsp;&nbsp;&nbsp; this.mailServer.set邮件(mail);&nbsp;&nbsp;<br>}</p>
<p>@Override<br>public void 建造邮件session(Session session) {<br>&nbsp;&nbsp;&nbsp; this.mailServer.setSession(session);&nbsp;&nbsp;<br>}<br>}<br><br><strong>&lt;7&gt;PasswordAuthenticator</strong> <br>import javax.mail.Authenticator;<br>import javax.mail.PasswordAuthentication;</p>
<p>class PasswordAuthenticator extends Authenticator {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String username;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String password;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public PasswordAuthenticator(String username, String password) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.username = username;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.password = password;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected PasswordAuthentication getPasswordAuthentication() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new PasswordAuthentication(username, password);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}<br><br><strong>&lt;8&gt;Email地址</strong><br>import javax.mail.internet.InternetAddress;<br>import javax.mail.internet.MimeUtility;</p>
<p>public class Email地址 {<br>protected String 地址;</p>
<p>protected String 地址显示别名;<br><br>public Email地址() {<br>&nbsp;&nbsp;<br>}<br><br>public Email地址(String 地址, String 地址显示别名){<br>&nbsp;&nbsp;&nbsp; this.地址 = 地址;<br>&nbsp;&nbsp;&nbsp; this.地址显示别名 = 地址显示别名;<br>}</p>
<p>public String get地址() {<br>&nbsp;&nbsp;&nbsp; return 地址;<br>}</p>
<p>public void set地址(String 地址) {<br>&nbsp;&nbsp;&nbsp; this.地址 = 地址;<br>}</p>
<p>public String get地址显示别名() {<br>&nbsp;&nbsp;&nbsp; return 地址显示别名;<br>}</p>
<p>public void set地址显示别名(String 地址显示别名) {<br>&nbsp;&nbsp;&nbsp; this.地址显示别名 = 地址显示别名;<br>}</p>
<p>public InternetAddress toInternetAddress() throws Exception {<br>&nbsp;&nbsp;&nbsp; if (地址显示别名 != null &amp;&amp; !地址显示别名.trim().equals("")) {<br>&nbsp;&nbsp;&nbsp;&nbsp; return new InternetAddress(地址, MimeUtility.encodeWord(地址显示别名,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "utf-8", "Q"));<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return new InternetAddress(地址);<br>}<br>}<br><br><strong>&lt;9&gt;发送邮件Director</strong> <br>import javax.mail.Session;</p>
<p>public class 发送邮件Director {<br>Abstract发送邮件建造者 build;<br><br>public 发送邮件Director(Abstract发送邮件建造者 build) {<br>&nbsp;&nbsp;&nbsp; this.build = build;<br>}<br><br>public void 发送邮件建造(IMail mail, Session session) {<br>&nbsp;&nbsp;&nbsp; this.build.建造邮件(mail);<br>&nbsp;&nbsp;&nbsp; this.build.建造邮件session(session);<br>&nbsp;&nbsp;&nbsp; this.build.建造发送邮件();<br>}<br>}</p>
<p><strong>&lt;10&gt;Client</strong> <br>import java.io.File;<br>import java.util.ArrayList;<br>import java.util.List;<br>import java.util.Properties;</p>
<p>import javax.mail.BodyPart;<br>import javax.mail.Session;<br>import javax.mail.internet.MimeBodyPart;</p>
<p>public class Client {<br>public static void main(String args[]) throws Exception {<br>&nbsp;&nbsp;&nbsp; IMail mail = new Mail();<br>&nbsp;&nbsp;&nbsp; mail.set主题("제외되는");<br>&nbsp;&nbsp;&nbsp; mail.set发件人(new Email地址("<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#97;&#109;&#101;&#115;&#95;&#122;&#104;&#97;&#111;&#95;&#97;&#98;&#109;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;" _fcksavedurl="mailto:james_zhao_abm@163.com">james_zhao_abm@163.com</a>","赵成明"));<br>&nbsp;&nbsp;&nbsp; List&lt;Email地址&gt; list = new ArrayList&lt;Email地址&gt;();<br>&nbsp;&nbsp;&nbsp; list.add(new Email地址("<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#115;&#122;&#104;&#97;&#111;&#99;&#104;&#101;&#110;&#103;&#109;&#105;&#110;&#103;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;" _fcksavedurl="mailto:jszhaochengming@hotmail.com">jszhaochengming@hotmail.com</a>","刘德华"));<br>&nbsp;&nbsp;&nbsp; mail.set收件人(list);<br>&nbsp;&nbsp;&nbsp; list&nbsp;&nbsp;&nbsp; = new ArrayList&lt;Email地址&gt;();<br>&nbsp;&nbsp;&nbsp; list.add(new Email地址("<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#97;&#109;&#101;&#115;&#95;&#122;&#104;&#97;&#111;&#95;&#97;&#98;&#109;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;" _fcksavedurl="mailto:james_zhao_abm@163.com">james_zhao_abm@163.com</a>","纯净水"));<br>&nbsp;&nbsp;&nbsp; list.add(new Email地址("<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#115;&#122;&#104;&#97;&#111;&#99;&#104;&#101;&#110;&#103;&#109;&#105;&#110;&#103;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;" _fcksavedurl="mailto:jszhaochengming@hotmail.com">jszhaochengming@hotmail.com</a>","刘德华"));<br>&nbsp;&nbsp;&nbsp; mail.set抄送人(list);<br>&nbsp;&nbsp;&nbsp; BodyPart contentPart = new MimeBodyPart();<br>&nbsp;&nbsp;&nbsp; contentPart.setHeader("Content-Transfer-Encoding",&nbsp;&nbsp;&nbsp;&nbsp; "base64");&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; contentPart.setContent("测试哟见呵呵","text/html;charset=utf-8");<br>&nbsp;&nbsp;&nbsp; mail.setCotnent(contentPart);<br>&nbsp;&nbsp;&nbsp; List&lt;File&gt; listF = new ArrayList&lt;File&gt;();<br>&nbsp;&nbsp;&nbsp; listF.add(new File("d:/출주제외되는2.rar"));<br>&nbsp;&nbsp;&nbsp; mail.set附件(listF);<br>&nbsp;&nbsp;&nbsp; Smtp发送邮件建造者 smtp = new Smtp发送邮件建造者();<br>&nbsp;&nbsp;&nbsp; Properties 属性配置&nbsp;&nbsp;&nbsp; = new Properties();<br>&nbsp;&nbsp;&nbsp; 属性配置.put("mail.smtp.host", "smtp.163.com");<br>&nbsp;&nbsp;&nbsp; 属性配置.put("mail.smtp.auth", "true");<br>&nbsp;&nbsp;&nbsp; Session session = Session.getInstance(属性配置,new PasswordAuthenticator("xxxxx", "xxxxx"));<br>&nbsp;&nbsp;&nbsp; 发送邮件Director director = new 发送邮件Director(smtp);<br>&nbsp;&nbsp;&nbsp; director.发送邮件建造(mail, session);<br>}<br>}</p>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/136481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-13 18:58 <a href="http://www.blogjava.net/zhaochengming/archive/2007/08/13/136481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式 简单工厂模式</title><link>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136479.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 13 Aug 2007 10:57:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136479.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/136479.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/136479.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/136479.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: 2em">简单工厂模式是类的创建模式，又叫做静态工厂方法模式（Static Factory Method）。</p>
<p style="TEXT-INDENT: 2em">简单工厂模式是由一个工厂对象来决定创建出哪一种产品类的对象。</p>
<p style="TEXT-INDENT: 2em">简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一种产品类的对象。</p>
<p style="TEXT-INDENT: 2em">/*******************************************/</p>
<p style="TEXT-INDENT: 2em">package 工厂.简单工厂模式;</p>
<p style="TEXT-INDENT: 2em">public interface 汽车 {</p>
<p style="TEXT-INDENT: 2em">public void 开车();</p>
<p style="TEXT-INDENT: 2em"></p>
<p style="TEXT-INDENT: 2em">public void 停车();</p>
<p style="TEXT-INDENT: 2em"></p>
<p style="TEXT-INDENT: 2em">public void 年检();</p>
<p style="TEXT-INDENT: 2em"></p>
<p style="TEXT-INDENT: 2em">public void 鸣笛();</p>
<p style="TEXT-INDENT: 2em"></p>
<p style="TEXT-INDENT: 2em">//...等等</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">/*******************************************/</p>
<p style="TEXT-INDENT: 2em">package 工厂.简单工厂模式;</p>
<p style="TEXT-INDENT: 2em">public class 宝马汽车 implements 汽车 {</p>
<p style="TEXT-INDENT: 2em">public static final String ;</p>
<p style="TEXT-INDENT: 2em">public static final String BRAND = "宝马汽车";</p>
<p style="TEXT-INDENT: 2em">public void 开车() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; System.out.println(BRAND+".开车");</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">public void 停车() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; System.out.println(BRAND+".停车");</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">public void 年检() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; System.out.println(BRAND+".年检");</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">public void 鸣笛() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; System.out.println(BRAND+".鸣笛");</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">/*******************************************/</p>
<p style="TEXT-INDENT: 2em">package 工厂.简单工厂模式;</p>
<p style="TEXT-INDENT: 2em">public class 奔驰汽车 implements 汽车 {</p>
<p style="TEXT-INDENT: 2em">public static final String ;</p>
<p style="TEXT-INDENT: 2em">public static final String BRAND = "奔驰汽车";</p>
<p style="TEXT-INDENT: 2em">public void 开车() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; System.out.println(BRAND+".开车");</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">public void 停车() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; System.out.println(BRAND+".停车");</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">public void 年检() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; System.out.println(BRAND+".年检");</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">public void 鸣笛() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; System.out.println(BRAND+".鸣笛");</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">/*******************************************/</p>
<p style="TEXT-INDENT: 2em">package 工厂.简单工厂模式;</p>
<p style="TEXT-INDENT: 2em">public class 汽车销售工厂 {</p>
<p style="TEXT-INDENT: 2em">public static 汽车 试车(String ID) throws Exception {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; if (ID.equals(宝马汽车.ID)) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; return new 宝马汽车();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; } else if (ID.equals(奔驰汽车.ID)) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; return new 奔驰汽车();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; throw new Exception("没有这个品牌的汽车!");</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">/*******************************************/</p>
<p style="TEXT-INDENT: 2em">package 工厂.简单工厂模式;</p>
<p style="TEXT-INDENT: 2em">public class 消费者 {</p>
<p style="TEXT-INDENT: 2em">public void 试试汽车(String ID) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; try {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; 汽车 car = 汽车销售工厂.试车(ID);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; car.开车();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; car.停车();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; car.鸣笛();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("连宝马都没有,换个销售公司!");</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em"></p>
<p style="TEXT-INDENT: 2em">public static void main(String args[]) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; 消费者 王二 = new 消费者();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; 王二.试试汽车(宝马汽车.ID);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; 王二.试试汽车(奔驰汽车.ID);</p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">}</p>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/136479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-13 18:57 <a href="http://www.blogjava.net/zhaochengming/archive/2007/08/13/136479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于java抽象工厂模式的一点想法</title><link>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136480.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 13 Aug 2007 10:57:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136480.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/136480.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/136480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/136480.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: 2em">以下为java抽象工厂模式的一个例子，都是个人的一点想法，有什么不足的地方，恳求大家予以指出，欢迎讨论</p>
<p style="TEXT-INDENT: 2em">我们使用的界面上有</p>
<p style="TEXT-INDENT: 2em">文本 {Linux文本,Windows文本}</p>
<p style="TEXT-INDENT: 2em">标签 {Linux标签,Windows标签}</p>
<p style="TEXT-INDENT: 2em">等等.</p>
<p style="TEXT-INDENT: 2em">第一部分 抽象工厂的实现</p>
<p style="TEXT-INDENT: 2em">interface 文本 {}</p>
<p style="TEXT-INDENT: 2em">interface 标签 {}</p>
<p style="TEXT-INDENT: 2em">class Linux文本 implements 文本{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Linux文本";</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class Linux标签 implements 标签{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Linux标签";</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class Windows文本 implements 文本{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Windows文本";</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class Windows标签 implements 标签{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Windows标签";</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">interface 组件工厂 {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public 文本 生产文本组件();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public 标签 生产标签组件();</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class Linux组件工厂 implements 组件工厂 {&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public 文本 生产文本组件() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new Linux文本();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public 标签 生产标签组件() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new Linux标签();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class Windows标签组件工厂 implements 组件工厂 {&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public 文本 生产文本组件() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new Windows文本();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public 标签 生产标签组件() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new Windows标签();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class 客户系统显示 {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; private 文本 text;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; private 标签 label;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 客户系统显示 clientOS = new 客户系统显示();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 组件工厂 factory = new Linux组件工厂();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientOS.label = factory.生产标签组件();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientOS.text = factory.生产文本组件();&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(clientOS.label);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(clientOS.text);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">如果按照上面的标准，我们要添加一个新的组件 下拉框</p>
<p style="TEXT-INDENT: 2em">A.需要修改的地方有</p>
<p style="TEXT-INDENT: 2em">1.组件工厂</p>
<p style="TEXT-INDENT: 2em">2.Linux组件工厂 </p>
<p style="TEXT-INDENT: 2em">3.Windows标签组件工厂</p>
<p style="TEXT-INDENT: 2em">B.需要增加的有</p>
<p style="TEXT-INDENT: 2em">1.interface 下拉框 {}</p>
<p style="TEXT-INDENT: 2em">2.class Linux下拉框 implements 下拉框</p>
<p style="TEXT-INDENT: 2em">3.class Windows下拉框 implements 下拉框</p>
<p style="TEXT-INDENT: 2em">C.调用的地方也会多出一个factory.生产下拉框组件();&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em"></p>
<p style="TEXT-INDENT: 2em">第二部分 改革抽象工厂</p>
<p style="TEXT-INDENT: 2em">有没有觉得要改动的地方有点多呢,下面我们来改革一下</p>
<p style="TEXT-INDENT: 2em">1.把 组件工厂中的</p>
<p style="TEXT-INDENT: 2em">生产文本组件();</p>
<p style="TEXT-INDENT: 2em">生产标签组件();</p>
<p style="TEXT-INDENT: 2em">...</p>
<p style="TEXT-INDENT: 2em">都改为</p>
<p style="TEXT-INDENT: 2em">生产组件(组件标识);</p>
<p style="TEXT-INDENT: 2em">这样带来的好处就是前面提到的，以下的修改就免去了</p>
<p style="TEXT-INDENT: 2em">/**************************/</p>
<p style="TEXT-INDENT: 2em">......</p>
<p style="TEXT-INDENT: 2em">A.需要修改的地方有</p>
<p style="TEXT-INDENT: 2em">1.组件工厂</p>
<p style="TEXT-INDENT: 2em">2.Linux组件工厂 </p>
<p style="TEXT-INDENT: 2em">3.Windows标签组件工厂</p>
<p style="TEXT-INDENT: 2em">......</p>
<p style="TEXT-INDENT: 2em">/**************************/</p>
<p style="TEXT-INDENT: 2em">要做到上面的，需要做以下几件事情</p>
<p style="TEXT-INDENT: 2em">1.增加一个Annotation来说明后面增加的 组件注册表 </p>
<p style="TEXT-INDENT: 2em">@interface 组件描述 {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Class 组件类();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">2.增加一个Enum</p>
<p style="TEXT-INDENT: 2em">enum 组件注册表 {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; /**</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Linux_文本 的对应实体类为 Linux文本</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; @组件描述(组件类 = Linux文本.class)</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Linux_文本,</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; @组件描述(组件类 = Linux标签.class)</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Linux_标签,</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; @组件描述(组件类 = Windows文本.class)</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Windows_文本,</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; @组件描述(组件类 = Windows标签.class)</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Windows_标签,</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">3.我们不再需要</p>
<p style="TEXT-INDENT: 2em">interface 组件工厂，class Windows标签组件工厂，class Linux组件工厂</p>
<p style="TEXT-INDENT: 2em">我们把 接口 组件工厂改为实体类</p>
<p style="TEXT-INDENT: 2em">为了保持可以扩展和维护</p>
<p style="TEXT-INDENT: 2em">我们定义了一个 接口 工厂</p>
<p style="TEXT-INDENT: 2em">interface 工厂 {</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class 组件工厂 implements 工厂 {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public 组件 生产组件(组件注册表 ID) throws Exception {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field f = 组件注册表.class.getField(ID.toString());</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 组件描述 描述 = f.getAnnotation(组件描述.class);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class 组件类 = 描述.组件类();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (组件) 组件类.newInstance(); </p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 注意,组件类.newInstance();的调用的时候要确保这个组件类有个不带参数的构造函数</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果要使用带参数的构造函数,可以在@interface 组件描述 中增加一个成员 </p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 构造函数[] 构造函数参数() default{};</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // @interface 构造函数 {Class[] 构造函数的参数();}</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 通过 组件类.getConstructors(); 来得到这个类的不同构造方法</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 这样就可以根据用户提供的信息用不同的构造函数实例话对象</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 带不同的构造函数,这里先不讨论，后面我会给出代码</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception ("没有找到对应的组件");</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">经过上面的修改,代码如下</p>
<p style="TEXT-INDENT: 2em">import java.lang.annotation.Retention;</p>
<p style="TEXT-INDENT: 2em">import java.lang.annotation.RetentionPolicy;</p>
<p style="TEXT-INDENT: 2em">import java.lang.reflect.Field;</p>
<p style="TEXT-INDENT: 2em">@Retention(RetentionPolicy.RUNTIME)</p>
<p style="TEXT-INDENT: 2em">@interface 组件描述 {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Class 组件类();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">enum 组件注册表 {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; @组件描述(组件类 = Linux文本.class)</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Linux_文本,</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; @组件描述(组件类 = Linux标签.class)</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Linux_标签,</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; @组件描述(组件类 = Windows文本.class)</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Windows_文本,</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; @组件描述(组件类 = Windows标签.class)</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Windows_标签,</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">interface 组件 {}</p>
<p style="TEXT-INDENT: 2em">interface 文本 extends 组件 {}</p>
<p style="TEXT-INDENT: 2em">interface 标签 extends 组件 {}</p>
<p style="TEXT-INDENT: 2em">class Linux文本 implements 文本{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Linux文本";</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class Linux标签 implements 标签{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Linux标签";</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class Windows文本 implements 文本{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Windows文本";</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class Windows标签 implements 标签{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Windows标签";</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">interface 工厂 {}</p>
<p style="TEXT-INDENT: 2em">class 组件工厂 implements 工厂{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public 组件 生产组件(组件注册表 ID) throws Exception {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field f = 组件注册表.class.getField(ID.toString());</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 组件描述 描述 = f.getAnnotation(组件描述.class);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class 组件类 = 描述.组件类();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (组件) 组件类.newInstance(); </p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception ("没有找到对应的组件");</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class 客户系统显示 {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; private 文本 text;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; private 标签 label;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 客户系统显示 clientOS = new 客户系统显示();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 组件工厂 factory = new 组件工厂();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientOS.text = (文本) factory.生产组件(组件注册表.Linux_文本);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientOS.label = (标签) factory.生产组件(组件注册表.Linux_标签);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(clientOS.label);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(clientOS.text);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">这个时候我们增加一个 下拉框</p>
<p style="TEXT-INDENT: 2em">需要改动的地方</p>
<p style="TEXT-INDENT: 2em">1.增加一个 interface 下拉框 extends 组件 {}</p>
<p style="TEXT-INDENT: 2em">2.增加2个实现类 </p>
<p style="TEXT-INDENT: 2em">class Windows下拉框 implements 下拉框{}</p>
<p style="TEXT-INDENT: 2em">class Linux下拉框implements 下拉框{}</p>
<p style="TEXT-INDENT: 2em">3.组件注册表 增加2个成员</p>
<p style="TEXT-INDENT: 2em">@组件描述(组件类 = Linux下拉框.class)</p>
<p style="TEXT-INDENT: 2em">Linux_下拉框,&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">@组件描述(组件类 = Windows下拉框.class)</p>
<p style="TEXT-INDENT: 2em">Windows_下拉框,</p>
<p style="TEXT-INDENT: 2em">和上面的比起来我们只需要在 组件注册表中增加2个成员，而不需要去修改</p>
<p style="TEXT-INDENT: 2em">1.组件工厂</p>
<p style="TEXT-INDENT: 2em">2.Linux组件工厂 </p>
<p style="TEXT-INDENT: 2em">3.Windows标签组件工厂</p>
<p style="TEXT-INDENT: 2em">因为这里要修改3个地方，是不是觉得麻烦,反正我觉得麻烦了点</p>
<p style="TEXT-INDENT: 2em">还有一点就是用户调用的时候不需要再使用factory.生产标签组件();等方法，只要一个factory.生产组件就可以了,这样符合简单工厂的模式</p>
<p style="TEXT-INDENT: 2em">第三部分 带参数的构造函数代码</p>
<p style="TEXT-INDENT: 2em">import java.lang.annotation.Annotation;</p>
<p style="TEXT-INDENT: 2em">import java.lang.annotation.Retention;</p>
<p style="TEXT-INDENT: 2em">import java.lang.annotation.RetentionPolicy;</p>
<p style="TEXT-INDENT: 2em">import java.lang.reflect.Constructor;</p>
<p style="TEXT-INDENT: 2em">import java.lang.reflect.Field;</p>
<p style="TEXT-INDENT: 2em">import java.util.ArrayList;</p>
<p style="TEXT-INDENT: 2em">import java.util.List;</p>
<p style="TEXT-INDENT: 2em">@Retention(RetentionPolicy.RUNTIME)</p>
<p style="TEXT-INDENT: 2em">@interface 构造函数 {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; /**</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 构造函数的参数类型</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @return</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Class[] 构造函数的参数();</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">@Retention(RetentionPolicy.RUNTIME)</p>
<p style="TEXT-INDENT: 2em">@interface 组件描述 {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Class 组件类();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; /**</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 返回组件的构造函数 &lt;br&gt;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果长度为0,则调用没有参数的构造函数 &lt;br&gt;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @return 构造函数[]</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; 构造函数[] 构造函数参数() default{};</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">enum 组件注册表 {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; /**</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Linux_文本 的对应实体类为 Linux文本 &lt;br&gt;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Linux的构造函数有 &lt;br&gt;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 1. Linux文本(String 显示的文字) ; &lt;br&gt;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 2. Linux文本(String 显示的文字, Integer 文本字体大小);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; @组件描述(组件类 = Linux文本.class, </p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构造函数参数 = {@构造函数(构造函数的参数={String.class}) ,</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @构造函数(构造函数的参数={String.class, Integer.class}) } )</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Linux_文本,</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; @组件描述(组件类 = Linux标签.class)</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Linux_标签,</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; @组件描述(组件类 = Windows文本.class)</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Windows_文本,</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; @组件描述(组件类 = Windows标签.class)</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Windows_标签,</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">interface 组件 {}</p>
<p style="TEXT-INDENT: 2em">interface 文本 extends 组件 {}</p>
<p style="TEXT-INDENT: 2em">interface 标签 extends 组件 {}</p>
<p style="TEXT-INDENT: 2em">class Linux文本 implements 文本{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; private String text;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; private Integer size;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public Linux文本(String text) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.text = text;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public Linux文本(String text, Integer size) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.text = text;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.size = size;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Linux文本" + (text == null ? "":",文本内容为:"+text) + (size == null ? "":",文本字体大小为:"+size);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class Linux标签 implements 标签{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Linux标签";</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class Windows文本 implements 文本{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Windows文本";</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class Windows标签 implements 标签{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Windows标签";</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">interface 工厂 {}</p>
<p style="TEXT-INDENT: 2em">class 组件工厂 implements 工厂{</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public 组件 生产组件(组件注册表 ID, Object[] 参数) throws Exception {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field f = 组件注册表.class.getField(ID.toString());</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 组件描述 描述 = f.getAnnotation(组件描述.class);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class 组件类 = 描述.组件类();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构造函数[] ano = 描述.构造函数参数();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (参数 != null) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; ano.length; i++) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构造函数 temp = ano<em>;</em></p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class[] 构造函数S = temp.构造函数的参数();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (参数.length == 构造函数S.length) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; 参数.length; j++) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (参数[j].getClass().toString().equals(构造函数S[j].toString())) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( j == 参数.length - 1) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor cons = 组件类.getConstructor(构造函数S);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (组件) cons.newInstance(参数);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else break;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception ("没有找到对应的组件");</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else </p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (组件) 组件类.newInstance(); </p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception ("没有找到对应的组件");</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<p style="TEXT-INDENT: 2em">class 客户系统显示 {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; private 文本 text;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; private 标签 label;</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 客户系统显示 clientOS = new 客户系统显示();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 组件工厂 factory = new 组件工厂();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object [] params = {"初始化文本", new Integer(20)};</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientOS.text = (文本) factory.生产组件(组件注册表.Linux_文本,params);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientOS.label = (标签) factory.生产组件(组件注册表.Linux_标签,null);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(clientOS.label);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(clientOS.text);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object [] params2 = {"初始化"};</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientOS.text = (文本) factory.生产组件(组件注册表.Linux_文本,params2);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(clientOS.text);</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="TEXT-INDENT: 2em">}</p>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/136480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-13 18:57 <a href="http://www.blogjava.net/zhaochengming/archive/2007/08/13/136480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>