java工廠模式三種詳解
工廠方法模式(Factory Method)
工廠方法模式分為三種:
1、普通工廠模式,就是建立一個工廠類,對實現了同一介面的一些類進行例項的建立。首先看下關係圖:
舉例如下:(我們舉一個傳送郵件和簡訊的例子)
首先,建立二者的共同介面:
- publicinterface Sender {
- publicvoid Send();
- }
其次,建立實現類:
- publicclass MailSender implements Sender {
- @Override
- publicvoid Send() {
- System.out.println("this is mailsender!"
- }
- }
- publicclass SmsSender implements Sender {
- @Override
- publicvoid Send() {
- System.out.println("this is sms sender!");
- }
- }
最後,建工廠類:
- publicclass SendFactory {
- public Sender produce(String type) {
- if ("mail".equals(type)) {
- returnnew MailSender();
- } elseif ("sms".equals(type)) {
- returnnew SmsSender();
- } else {
- System.out.println("請輸入正確的型別!");
- returnnull;
- }
- }
- }
我們來測試下:
- publicclass FactoryTest {
- publicstaticvoid main(String[] args) {
- SendFactory factory = new SendFactory();
- Sender sender = factory.produce("sms");
- sender.Send();
- }
- }
輸出:this is sms sender!
2、多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。關係圖:
將上面的程式碼做下修改,改動下SendFactory類就行,如下:
[java] view plaincopypublicclass SendFactory { public Sender produceMail(){- returnnew MailSender();
- }
- public Sender produceSms(){
- returnnew SmsSender();
- }
- }
測試類如下:
- publicclass FactoryTest {
- publicstaticvoid main(String[] args) {
- SendFactory factory = new SendFactory();
- Sender sender = factory.produceMail();
- sender.Send();
- }
- }
輸出:this is mailsender!
3、靜態工廠方法模式,將上面的多個工廠方法模式裡的方法置為靜態的,不需要建立例項,直接呼叫即可。
- publicclass SendFactory {
- publicstatic Sender produceMail(){
- returnnew MailSender();
- }
- publicstatic Sender produceSms(){
- returnnew SmsSender();
- }
- }
- publicclass FactoryTest {
- publicstaticvoid main(String[] args) {
- Sender sender = SendFactory.produceMail();
- sender.Send();
- }
- }
輸出:this is mailsender!
總體來說,工廠模式適合:凡是出現了大量的產品需要建立,並且具有共同的介面時,可以通過工廠方法模式進行建立。在以上的三種模式中,第一種如果傳入的字串有誤,不能正確建立物件,第三種相對於第二種,不需要例項化工廠類,所以,大多數情況下,我們會選用第三種——靜態工廠方法模式。
4、抽象工廠模式(Abstract Factory)
工廠方法模式有一個問題就是,類的建立依賴工廠類,也就是說,如果想要拓展程式,必須對工廠類進行修改,這違背了閉包原則,所以,從設計角度考慮,有一定的問題,如何解決?就用到抽象工廠模式,建立多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的程式碼。因為抽象工廠不太好理解,我們先看看圖,然後就和程式碼,就比較容易理解。
請看例子:
- publicinterface Sender {
- publicvoid Send();
- }
兩個實現類:
- publicclass MailSender implements Sender {
- @Override
- publicvoid Send() {
- System.out.println("this is mailsender!");
- }
- }
- publicclass SmsSender implements Sender {
- @Override
- publicvoid Send() {
- System.out.println("this is sms sender!");
- }
- }
兩個工廠類:
- publicclass SendMailFactory implements Provider {
- @Override
- public Sender produce(){
- returnnew MailSender();
- }
- }
- publicclass SendSmsFactory implements Provider{
- @Override
- public Sender produce() {
- returnnew SmsSender();
- }
- }
在提供一個介面:
- publicinterface Provider {
- public Sender produce();
- }
測試類:
- publicclass Test {
- publicstaticvoid main(String[] args) {
- Provider provider = new SendMailFactory();
- Sender sender = provider.produce();
- sender.Send();
- }
- }
其實這個模式的好處就是,如果你現在想增加一個功能:發及時資訊,則只需做一個實現類,實現Sender介面,同時做一個工廠類,實現Provider介面,就OK了,無需去改動現成的程式碼。這樣做,拓展性較好!