java設計模式-工廠模式
什麼是工廠模式
工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。
工廠模式的優點
- 良好的封裝性,降低模組的耦合性。利用工廠模式,我們可以不在關注類的建立過程,只需要知道建立的條件,不需要關注過程,就可以獲得所需物件
- 高擴充套件性。如果要擴充套件新的功能,只需要新生成一個工廠類或者擴充套件,就可以完成。像jdbc連結池,對應不同的驅動,只需要擴充套件驅動,不需要動其他東西。
工廠模式的缺點
沒有一個事物是完美的,擁有那麼多優點的工廠模式又有哪些缺點呢?
- 增加新的產品等級結構很複雜,需要修改抽象工廠和所有的具體工廠類,對“開閉原則”的支援呈現傾斜性。在一開始我們需要大量的編碼工作去組合工廠,這就增加了很多工作量
工廠模式的應用場景
- 相同功能,不同處理方式的場景。比如:日誌,jdbc
工廠模式程式碼樣例
樣例背景:簡單的設計一個,生產不同的名字,在中文中有姓和名,名字都是隨機生成的,那麼姓呢,在中文中姓可是有很多的,所以我們可以利用工廠模式,來構建不同姓的名字。
抽象工廠類:
abstract String buildName(Class<? extends SurnameInterface> clas) throws IllegalAccessException, InstantiationException;
public static String getChinese() {
String str = null;
int highPos, lowPos;
Random random = new Random();
//區碼,0xA0打頭,從第16區開始,即0xB0=11*16=176,16~55一級漢字,56~87二級漢字
highPos = (176 + Math.abs(random.nextInt(71)));
random=new Random();
//位碼,0xA0打頭,範圍第1~94列
lowPos = 161 + Math.abs(random.nextInt(94));
byte[] bArr = new byte[2];
bArr[0] = (new Integer(highPos)).byteValue();
bArr[1] = (new Integer(lowPos)).byteValue();
try {
//區位碼組合成漢字
str = new String(bArr, "GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return str;
}
複製程式碼
工廠實現類:
@Override
String buildName(Class<? extends SurnameInterface> clas) throws IllegalAccessException, InstantiationException {
SurnameInterface surnameInterface=clas.newInstance();
String surname=surnameInterface.getSurname();
String name=surname+getChinese();
System.out.println(name);
return name;
}
複製程式碼
生產類介面:
public interface SurnameInterface {
String getSurname();
}
複製程式碼
生產類實現:
public class ZhaoSurname implements SurnameInterface {
@Override
public String getSurname() {
return "趙";
}
}
複製程式碼
public class ZhengSurname implements SurnameInterface {
@Override
public String getSurname() {
return "鄭";
}
}
複製程式碼
Main:
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
AbsrractFactory absrractFactory=new NameFactiry();
absrractFactory.buildName(ZhengSurname.class);
absrractFactory.buildName(ZhaoSurname.class);
}
複製程式碼
這樣我們需要新增一個姓,只需要構建一個生產類,就可以不動原始碼結構,做到我們想要做的事情