java中factory方法_Java的23中设计模式--工厂方法模式(Factory Method)
1.普通工廠模式
工廠類
/*** @Title Factory.java
* @Package factory.factory1
* @date 2015-1-22 上午10:16:02
*@versionV1.0*/
packagefactory.factory1;/*** @ClassName Factory
* @date 2015-1-22 上午10:16:02*/
public classFactory {publicSender procedure(String type) {if("mail".endsWith(type))
{return newMailSender();
}if("sms".endsWith(type))
{return newSMSSender();
}else{
System.out.println("未輸入正確的類型");//更好的話加入異常
return null;
}
}
}
發送器接口
/*** @Title Sender.java
* @Package factory.factory1
* @date 2015-1-22 上午10:07:24
*@versionV1.0*/
packagefactory.factory1;/*** @ClassName Sender
* @date 2015-1-22 上午10:07:24*/
public interfaceSender {public voidsend();
}
發送器實現類
/*** @Title MailSender.java
* @Package factory.factory1
* @date 2015-1-22 上午10:09:29
*@versionV1.0*/
packagefactory.factory1;/*** @ClassName MailSender
* @date 2015-1-22 上午10:09:29*/
public class MailSender implementsSender{/*(non-Javadoc)
* @see factory.factory1.Sender#send()*/@Overridepublic voidsend() {
System.out.println("this is a mailsender");
}
}
/*** @Title SMSSender.java
* @Package factory.factory1
* @date 2015-1-22 上午10:14:36
*@versionV1.0*/
packagefactory.factory1;/*** @ClassName SMSSender
* @date 2015-1-22 上午10:14:36*/
public class SMSSender implementsSender{/*(non-Javadoc)
* @see factory.factory1.Sender#send()*/@Overridepublic voidsend() {
System.out.println("this is a smssender");
}
}
測試類:
/*** @Title Test.java
* @Package factory.factory1
* @date 2015-1-22 上午10:20:19
*@versionV1.0*/
packagefactory.factory1;/*** @ClassName Test
* @date 2015-1-22 上午10:20:19*/
public classTest {public static voidmain(String[] args) {
Factory factory= newFactory();
Sender sender= factory.procedure("mail");
sender.send();
}
}
這種方法的實現方式對傳入的類型要求比較高,就是傳入的參數如果錯誤就不能夠獲得相對應的產生的東西。
2.多個工廠的方法
/*** @Title Factory.java
* @Package factory.factory1
* @date 2015-1-22 上午10:16:02
*@versionV1.0*/
packagefactory.factory3;/*** @ClassName Factory
* @date 2015-1-22 上午10:16:02*/
public classFactory {publicSender mailSender(){return newMailSender();
}publicSender smsSender(){return newSMSSender();
}
}
將上面的工廠類修改成這樣子即可。
測試類:
/*** @Title Test.java
* @Package factory.factory1
* @date 2015-1-22 上午10:20:19
*@versionV1.0*/
packagefactory.factory3;/*** @ClassName Test
* @date 2015-1-22 上午10:20:19*/
public classTest {public static voidmain(String[] args) {
Factory factory= newFactory();
Sender sender=factory.mailSender();
sender.send();
}
}
3.靜態工廠的方法 將工廠的方法修改成靜態的方法
/*** @Title Factory.java
* @Package factory.factory1
* @date 2015-1-22 上午10:16:02
*@versionV1.0*/
packagefactory.factory4;/*** @ClassName Factory
* @date 2015-1-22 上午10:16:02*/
public classFactory {public staticSender mailSender(){return newMailSender();
}public staticSender smsSender(){return newSMSSender();
}
}
測試類
/*** @Title Test.java
* @Package factory.factory1
* @date 2015-1-22 上午10:20:19
*@versionV1.0*/
packagefactory.factory4;/*** @ClassName Test
* @date 2015-1-22 上午10:20:19*/
public classTest {public static voidmain(String[] args) {//Factory factory = new Factory();
Sender sender =Factory.mailSender();
sender.send();
}
}
4.抽象工廠模式
工廠方法模式有一個問題就是,類的創建依賴工廠類,也就是說,如果想要拓展程序,必須對工廠類進行修改,這違背了閉包原則,所以,從設計角度考慮,有一定 的問題,如何解決?就用到抽象工廠模式,創建多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼。因為抽象工廠不 太好理解,我們先看看圖,然后就和代碼,就比較容易理解。
提供一個工廠的接口
/*** @Title Provider.java
* @Package factory.factory2
* @date 2015-1-22 上午10:36:18
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName Provider
* @date 2015-1-22 上午10:36:18*/
public interfaceProvider {publicSender procedure();
}
提供一個發送的接口
/*** @Title Sender.java
* @Package factory.factory2
* @date 2015-1-22 上午10:37:03
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName Sender
* @date 2015-1-22 上午10:37:03*/
public interfaceSender {public voidsend();
}
分別兩個類來實現這發送接口
/*** @Title MailSender.java
* @Package factory.factory2
* @date 2015-1-22 上午10:45:05
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName MailSender
* @date 2015-1-22 上午10:45:05*/
public class MailSender implementsSender{/*(non-Javadoc)
* @see factory.factory2.Sender#send()*/@Overridepublic voidsend() {
System.out.println("this is a mail sender");
}
}
/*** @Title SmsSender.java
* @Package factory.factory2
* @date 2015-1-22 上午10:40:06
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName SmsSender
* @date 2015-1-22 上午10:40:06*/
public class SmsSender implementsSender{/*(non-Javadoc)
* @see factory.factory2.Sender#send()*/@Overridepublic voidsend() {
System.out.println("this is a mail sender");
}
}
提供兩個類實現抽象工廠的接口
/*** @Title SendMailFactory.java
* @Package factory.factory2
* @date 2015-1-22 上午10:44:34
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName SendMailFactory
* @date 2015-1-22 上午10:44:34*/
public class SendMailFactory implementsProvider {/*(non-Javadoc)
* @see factory.factory2.Provider#procedure()*/@OverridepublicSender procedure() {//TODO Auto-generated method stub
return newMailSender();
}
}
/*** @Title SmsSendFactory.java
* @Package factory.factory2
* @date 2015-1-22 上午10:41:23
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName SmsSendFactory
* @date 2015-1-22 上午10:41:23*/
public class SmsSendFactory implementsProvider{/*(non-Javadoc)
* @see factory.factory2.Provider#procedure()*/@OverridepublicSender procedure() {//TODO Auto-generated method stub
return newSmsSender();
}
}
測試類:
/*** @Title Test.java
* @Package factory.factory2
* @date 2015-1-22 上午10:48:29
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName Test
* @date 2015-1-22 上午10:48:29*/
public classTest {public static voidmain(String[] args) {
Provider provider= newSendMailFactory();
Sender sender=provider.procedure();
sender.send();
}
}
總結
以上是生活随笔為你收集整理的java中factory方法_Java的23中设计模式--工厂方法模式(Factory Method)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 库乐队IOS版如何删除?库乐队IOS版删
- 下一篇: JAVA Java多线程与并发库