Java 設計模式學習-單例模式&工廠模式
阿新 • • 發佈:2018-11-06
最近看一個專案的原始碼,裡面的很多程式碼都不是很懂,原來是因為不理解程式碼中的設計模式,在一些大神的部落格中,學習一一些設計模式的知識,現把學習的內容記錄下來。
單例模式
單例模式是常用的設計模式,在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介面就可以了,不用修改原有的程式碼,符合開閉原則。