1、工廠方法模式(Factory Method)

工廠方法模式分為三種:

11、普通工廠模式,就是建立一個工廠類,對實現了同一接口的一些類進行實例的創建。首先看下關系圖:


舉例如下:(我們舉一個發送郵件和短信的例子)

首先,創建二者的共同接口:

[java]?view plaincopy

  1. public?interface?Sender?{??

  2. ????public?void?Send();??

  3. }??

其次,創建實現類:

[java]?view plaincopy

  1. public?class?MailSender?implements?Sender?{??

  2. ????@Override??

  3. ????public?void?Send()?{??

  4. ????????System.out.println("this?is?mailsender!");??

  5. ????}??

  6. }??

[java]?view plaincopy

  1. public?class?SmsSender?implements?Sender?{??

  2. ??

  3. ????@Override??

  4. ????public?void?Send()?{??

  5. ????????System.out.println("this?is?sms?sender!");??

  6. ????}??

  7. }??

最后,建工廠類:

[java]?view plaincopy

  1. public?class?SendFactory?{??

  2. ??

  3. ????public?Sender?produce(String?type)?{??

  4. ????????if?("mail".equals(type))?{??

  5. ????????????return?new?MailSender();??

  6. ????????}?else?if?("sms".equals(type))?{??

  7. ????????????return?new?SmsSender();??

  8. ????????}?else?{??

  9. ????????????System.out.println("請輸入正確的類型!");??

  10. ????????????return?null;??

  11. ????????}??

  12. ????}??

  13. }??

我們來測試下:

  1. public?class?FactoryTest?{??

  2. ??

  3. ????public?static?void?main(String[]?args)?{??

  4. ????????SendFactory?factory?=?new?SendFactory();??

  5. ????????Sender?sender?=?factory.produce("sms");??

  6. ????????sender.Send();??

  7. ????}??

  8. }??

輸出:this is sms sender!

22、多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字符串出錯,則不能正確創建對象,而多個工廠方法模式是提供多個工廠方法,分別創建對象。關系圖:


將上面的代碼做下修改,改動下SendFactory類就行,如下:

[java]?view plaincopypublic?class?SendFactory?{ ?

? ?public?Sender?produceMail(){ ?

  1. ????????return?new?MailSender();??

  2. ????}??

  3. ??????

  4. ????public?Sender?produceSms(){??

  5. ????????return?new?SmsSender();??

  6. ????}??

  7. }??

測試類如下:

[java]?view plaincopy

  1. public?class?FactoryTest?{??

  2. ??

  3. ????public?static?void?main(String[]?args)?{??

  4. ????????SendFactory?factory?=?new?SendFactory();??

  5. ????????Sender?sender?=?factory.produceMail();??

  6. ????????sender.Send();??

  7. ????}??

  8. }??

輸出:this is mailsender!

33、靜態工廠方法模式,將上面的多個工廠方法模式里的方法置為靜態的,不需要創建實例,直接調用即可。

[java]?view plaincopy

  1. public?class?SendFactory?{??

  2. ??????

  3. ????public?static?Sender?produceMail(){??

  4. ????????return?new?MailSender();??

  5. ????}??

  6. ??????

  7. ????public?static?Sender?produceSms(){??

  8. ????????return?new?SmsSender();??

  9. ????}??

  10. }??

[java]?view plaincopy

  1. public?class?FactoryTest?{??

  2. ??

  3. ????public?static?void?main(String[]?args)?{??????

  4. ????????Sender?sender?=?SendFactory.produceMail();??

  5. ????????sender.Send();??

  6. ????}??

  7. }??

輸出:this is mailsender!

總體來說,工廠模式適合:凡是出現了大量的產品需要創建,并且具有共同的接口時,可以通過工廠方法模式進行創建。在以上的三種模式中,第一種如果傳入的字符串有誤,不能正確創建對象,第三種相對于第二種,不需要實例化工廠類,所以,大多數情況下,我們會選用第三種——靜態工廠方法模式。