Java設計模式之-工廠方法模式

Java設計模式之-工廠方法模式

工廠方法模式分爲三種:普通工廠模式、多個工廠方法模式、靜態工廠方法模式。

1、普通工廠模式:以發郵件和短信的例子說明。
結構如下圖所示

這裏寫圖片描述

主要分爲四個步驟:創建各實例的共同接口、創建各功能實例、創建工廠、主程序。請看如下示例代碼

public class FactoryMethodModel {

    public static void main(String[] args) {

        String type="mail";
        SendFactory factory=new SendFactory();
        Sender sender=factory.produce(type);
        sender.send();
    }
}

// 創建二者的共同接口
interface Sender
{
    void send();
}


// 創建實現類 MailSender
class MailSender implements Sender {  
    @Override  
    public void send() {  
        System.out.println("this is Mailsender!");  
    }  
}  

//創建實現類 SmsSender
class SmsSender implements Sender{
    public void send(){
        System.out.println("this is SmsSender");
    }
}


// 創建工廠類
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;
        }
    }
}

輸出:this is Mailsender!

2、多個工廠方法模式:

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

這裏寫圖片描述

將上面的代碼修改如下:

public class FactoryMethodModel {

    public static void main(String[] args) {

        SendFactory factory=new SendFactory();

        Sender sender1=factory.produceMailSender();
        Sender sender2=factory.produceSmsSender();
        sender1.send();
        sender2.send();
    }
}

// 創建二者的共同接口
interface Sender
{
    void send();
}


// 創建實現類 MailSender
class MailSender implements Sender {  
    @Override  
    public void send() {  
        System.out.println("this is Mailsender!");  
    }  
}  

//創建實現類 SmsSender
class SmsSender implements Sender{
    public void send(){
        System.out.println("this is SmsSender");
    }
}


// 創建工廠類,有多個工廠方法,分別用來創建不同的對象
class SendFactory{
    public Sender produceMailSender(){
        return new MailSender();
    }

    public Sender produceSmsSender(){
        return new SmsSender();
    }
}

輸出結果: this is Mailsender!
this is SmsSender

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

public class FactoryMethodModel {

    public static void main(String[] args) {

        Sender sender1=SendFactory.produceMailSender();
        Sender sender2=SendFactory.produceSmsSender();
        sender1.send();
        sender2.send();
    }
}

// 創建二者的共同接口
interface Sender
{
    void send();
}


// 創建實現類 MailSender
class MailSender implements Sender {  
    @Override  
    public void send() {  
        System.out.println("this is Mailsender!");  
    }  
}  

//創建實現類 SmsSender
class SmsSender implements Sender{
    public void send(){
        System.out.println("this is SmsSender");
    }
}


// 創建工廠類,有多個工廠方法,分別用來創建不同的對象
class SendFactory{
    public static Sender produceMailSender(){
        return new MailSender();
    }

    public static Sender produceSmsSender(){
        return new SmsSender();
    }
}

輸出結果: this is Mailsender!
this is SmsSender

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章