設計模式——1工廠方法模式(FactoryMethod)

inzaghi1984發表於2017-12-09

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
  7. public class SmsSender implements Sender {
  8. @Override
  9. public void Send() {
  10. System.out.println(“this is sms sender!”);
  11. }
  12. }
    最後,建工廠類:

[java] view plaincopy

  1. public class SendFactory {
  2. public Sender produce(String type) {
  3. if (“mail”.equals(type)) {
  4. return new MailSender();
  5. } else if (“sms”.equals(type)) {
  6. return new SmsSender();
  7. } else {
  8. System.out.println(“請輸入正確的型別!”);
  9. return null;
  10. }
  11. }
  12. }
    我們來測試下:
  13. public class FactoryTest {
  14. public static void main(String[] args) {
  15. SendFactory factory = new SendFactory();
  16. Sender sender = factory.produce(“sms”);
  17. sender.Send();
  18. }
  19. }
    輸出:this is sms sender!

22、多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。
將上面的程式碼做下修改,改動下SendFactory類就行,如下:
[java] view plaincopypublic class SendFactory {
public Sender produceMail(){

  1. return new MailSender();
  2. }
  3. public Sender produceSms(){
  4. return new SmsSender();
  5. }
  6. }
    測試類如下:

[java] view plaincopy

  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. SendFactory factory = new SendFactory();
  4. Sender sender = factory.produceMail();
  5. sender.Send();
  6. }
  7. }
    輸出:this is mailsender!

33、靜態工廠方法模式,將上面的多個工廠方法模式裡的方法置為靜態的,不需要建立例項,直接呼叫即可。
[java] view plaincopy

  1. public class SendFactory {
  2. public static Sender produceMail(){
  3. return new MailSender();
  4. }
  5. public static Sender produceSms(){
  6. return new SmsSender();
  7. }
  8. }
    [java] view plaincopy
  9. public class FactoryTest {
  10. public static void main(String[] args) {
  11. Sender sender = SendFactory.produceMail();
  12. sender.Send();
  13. }
  14. }
    輸出:this is mailsender!

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


相關文章