1. 程式人生 > >Java設計模式-簡單工廠模式/工廠模式/抽象工廠模式

Java設計模式-簡單工廠模式/工廠模式/抽象工廠模式

目錄

簡單工廠模式

工廠模式

抽象工廠模式

上述程式碼 GitHub 地址:https://github.com/baicun/designPatterns


共同點:建立一個類,對同樣操作的方法介面進行封裝,類似工廠管理生產線等情形。

優點:方便管理,易於拓展。

應用:資料庫訪問,我們只需要更換驅動包就可以。

簡單工廠模式

建立一個類,對同樣的操作進行封裝。

示例:

公共介面:

//公共介面
public interface Send {
    public void send();
}

實現類: 

//傳送簡訊
public class SmsSend implements Send {
    @Override
    public void send() {
        System.out.println("傳送簡訊成功");
    }
}
//傳送郵件
public class MailSend implements Send {
    @Override
    public void send() {
        System.out.println("傳送郵件成功");
    }
}

工廠類:

//工廠類
public class SendFactory {

    public Send produce(String type) {

        if ("mail".equals(type)) {
            return new MailSend();
        } else if ("sms".equals(type)) {
            return new SmsSend();
        } else {
            System.out.println("請輸入正確的型別!");
            return null;
        }
    }
}

測試:

    public static void main(String[] args) {
        SimpleFactory factory = new SimpleFactory();
        Send send = factory.proceMail();
        send.send();
    }

上面的程式碼就是實現簡單工廠模式。每當我們建立一個傳送一條資訊,首先輸入傳送型別,然後便可以傳送成功,這樣人為的錯誤比較高,隨便一個字母輸入錯誤就失敗了。接下來看工廠模式。

工廠模式

//簡單工廠類
public class SimpleFactory {
    //傳送郵件
    public Send proceMail(){
        return new MailSend();
    }
    //傳送簡訊
    public Send proceSms(){
        return new SmsSend();
    }
}

測試:

    public static void main(String[] args) {
        SimpleFactory factory = new SimpleFactory();
        Send send = factory.proceMail();
        send.send();
    }

如此實現工廠模式,已經很棒了,但是違反了設計模式原則,對拓展開放,對修改關閉!最後看最優模式。

抽象工廠模式

個人覺得抽象工廠模式可以理解為是對工廠模式的二層封裝。請看下面程式碼,以傳送郵件為例。

共倆個介面,最初介面:

//公共介面
public interface Send {
    public void send();
}

在增加提供一個介面:

//抽象介面
public interface Provider {
    public Send produce(String type);//傳送型別
}

介面的實現類

//QQ郵件實現類
public class SendMailQqImpl implements Send{
    @Override
    public void send() {
        System.out.println("傳送QQ郵件");
    }
}
//126郵件實現類
public class SendMail126Impl implements Send{
    @Override
    public void send() {
        System.out.println("傳送126郵件");
    }
}

工廠類;

//郵件工廠類
public class SendMailFactory implements Provider{
    public Send produce(String type){
        //如果 type=qq,則傳送qq郵件,否則傳送126郵件
        if("qq".equals(type)){
            return new SendMailQqImpl();
        }else{
            return new SendMail126Impl();
        }
    }
}

測試:

    // 測試
    public static void main(String[] args) {
        Provider provider = new SendMailFactory();//例項化工廠
        Send mailsend = provider.produce("qq");//得到實現方法
        mailsend.send();//執行介面方法
    }

以後我們在新增一個功能的話,只要建立一個實現 Send 介面的實現類,以及實現  Provider 的工廠類就可以拓展了。

 

上述程式碼 GitHub 地址:https://github.com/baicun/designPatterns