設計模式(Design Patterns)工廠方法模式(Factory Method)

weixin_34185364發表於2017-08-20

工廠方法模式分為三種:

普通工廠模式

建立一個工廠類,對實現了同一介面的一些類進行例項的建立。首先看下關係圖:

1396442-ea0061f984c03b05.png

舉例如下:(我們舉一個傳送郵件和簡訊的例子)

  • 建立介面類
package com.sima.java.factorymethod;

/**
 * Created by maple on 2017-08-19.
 */
public interface Sender {
    public void send();
}
  • 建立實體類
package com.sima.java.factorymethod;

/**
 * Created by maple on 2017-08-19.
 */
public class MailSender implements Sender {
    public void send() {
        System.out.println("send Mail!");
    }
}
package com.sima.java.factorymethod;

/**
 * Created by maple on 2017-08-19.
 */
public class SmsSender implements Sender {
    public void send() {
        System.out.println("send SMS!");
    }
}

  • 建立工廠類
package com.sima.java.factorymethod;



/**
 * Created by maple on 2017-08-19.
 */
public class SendFactory {

    public Sender produce(String type){
        if ("mail".equals(type)){
            return new MailSender();
        }else if ("sms".equals(type)){
            return new SmsSender();
        }else {
            System.out.println("輸入型別有誤");
            return null;
        }
    }
}
  • 測試
package com.sima.java;

import com.sima.java.factorymethod.SendFactory;
import com.sima.java.factorymethod.Sender;

public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
        SendFactory sendFactory = new SendFactory();
        Sender sender = sendFactory.produce("mail");
        sender.send();
        sender = sendFactory.produce("sms");
        sender.send();
    }
}
  • 執行結果


    1396442-d9db6e2387a9c86c.png

多個工廠方法模式

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

1396442-dbf8c1fadbd36716.png
  • 改造工廠類
package com.sima.java.factorymethod;

/**
 * Created by maple on 2017-08-19.
 */
public class SendFactoryMore {

    public Sender produceMail(){
        return new MailSender();
    }

    public Sender produceMsm(){
        return new SmsSender();
    }
}
  • 測試
package com.sima.java;

import com.sima.java.factorymethod.SendFactory;
import com.sima.java.factorymethod.SendFactoryMore;
import com.sima.java.factorymethod.Sender;

public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
        SendFactoryMore sendFactoryMore = new SendFactoryMore();
        Sender sender = sendFactoryMore.produceMail();
        sender.send();
        sender = sendFactoryMore.produceMsm();
        sender.send();

    }
}
  • 執行結果
1396442-f2e972b61489f5c9.png

靜態工廠方法模式

將上面的多工廠方法模式裡的方法置為靜態的,不需要建立例項,直接呼叫即可。

  • 改造工廠類
package com.sima.java.factorymethod;

/**
 * Created by maple on 2017-08-19.
 */
public class SendFactoryMoreStatic {

    public static Sender produceMail(){
        return new MailSender();
    }

    public static Sender produceMsm(){
        return new SmsSender();
    }
}
  • 測試
package com.sima.java;

import com.sima.java.factorymethod.SendFactory;
import com.sima.java.factorymethod.SendFactoryMore;
import com.sima.java.factorymethod.SendFactoryMoreStatic;
import com.sima.java.factorymethod.Sender;

public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );

        Sender sender = SendFactoryMoreStatic.produceMail();
        sender.send();
        sender = SendFactoryMoreStatic.produceMsm();
        sender.send();
    }
}
  • 執行結果
1396442-a8396db93ade41b6.png

小結

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

相關文章