1. 程式人生 > >Java 設計模式學習-單例模式&工廠模式

Java 設計模式學習-單例模式&工廠模式

最近看一個專案的原始碼,裡面的很多程式碼都不是很懂,原來是因為不理解程式碼中的設計模式,在一些大神的部落格中,學習一一些設計模式的知識,現把學習的內容記錄下來。

單例模式

單例模式是常用的設計模式,在java 應用中,能保證在一個JVM中,該物件只有一個例項存在,這樣的設計有幾個好處:
1.當某些類創造的比較頻繁,對於大量這樣的物件,對系統的記憶體是一筆很大的開銷。
2.省去了new 操作符,降低了系統記憶體的使用頻率,減輕了GC壓力。

public class Singleton {

    //1.將構造方法私有化,不允許外部直接建立物件
    private Singleton
() { } //2.建立類的唯一例項 private static Singleton singleton = null; //3.提供一個用於獲取例項的方法 public static Singleton getInstance() { if(singleton == null) { singleton = new Singleton(); } return singleton; } }

工廠方法模式(Factory Method)

工廠方法模式是類的建立模式,又叫虛擬構造子模式,或者多型性工廠模式,工廠方法模式的用意是定義一個建立產品物件的工廠介面,講實際建立工作推遲到子類中。
程式碼示例:
1.建立一個二者的共同介面

public interface Sender {

    public void Send();

}

2.建立兩個實現類

public class MailSender implements Sender {

    @Override
    public void Send() {
        System.out.println("this is mail sender!");
    }

}
public class SmsSender implements Sender {

    @Override
    public void Send() {
        System.out.println("this is sms sender!"
); } }

3.建立兩個工廠類

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;
        }
    }

}

測試程式碼:

public class Test {

    public static void main(String[] args) {
        Provider provider = new SendMailFactory();
        Sender sender = provider.produce("sms");
        sender.Send();
    }

}

抽象工廠模式

 抽象工廠模式有一個問題就是,類的建立依賴工廠類,也就是說,如果想要拓展程式,必須對工廠類進行修改,這違背了開閉原則,所以,從設計角度考慮,有一定的問題,如何解決?就用到抽象工廠模式,建立多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的程式碼。
 程式碼示例:
 1.建立一個二者共同介面
 

public interface Sender {

    public void Send();

}

2.建立兩個實現類

public class MailSender implements Sender {

    @Override
    public void Send() {
        System.out.println("this is mail sender!");
    }

}

public class SmsSender implements Sender {

    @Override
    public void Send() {
        System.out.println("this is sms sender!");
    }

}

3.建立兩個工廠類

public class SendMailFactory implements Provider {

    @Override
    public Sender produce() {
        return new MailSender();
    }

}

public class SendSmsFactory implements Provider {

    @Override
    public Sender produce() {
        return new SmsSender();
    }

}

4.建立一個提供介面

public interface Provider {

    public Sender produce();

}

測試程式碼:

“`
public class Test {

public static void main(String[] args) {
    Provider provider = new SendMailFactory();
    Sender sender = provider.produce();
    sender.Send();
}

}“`

 這裡如果要擴充套件的話,只需要寫一個實現類,實現Sender介面,再寫一個工廠類,實現Provider介面就可以了,不用修改原有的程式碼,符合開閉原則。