1靜態(tài)工廠方法
創(chuàng)建對(duì)象最常見(jiàn)的方法就是通過(guò)構(gòu)造器 出來(lái)
Date date = new Date();
SimpleDateFormat aDate=new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
還有一種方法-------靜態(tài)工廠方法
Fragment fragment = MyFragment.newIntance();
Calendar calendar = Calendar.getInstance();
Integer number = Integer.valueOf("1");
我們要?jiǎng)?chuàng)建一個(gè)Animal類:
public class Animal {
private String name;//名字
private int age;//年齡
private double weight;//體重
private int height;//高度
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public Animal(int age, int height) {
this.age = age;
this.height = height;
}
}
靜態(tài)工廠方法
public class Animal {
public static Animal getInstance() {
return new Animal();
}
}
優(yōu)點(diǎn):
1.有名稱:
構(gòu)造器 只能通過(guò)不同參數(shù)來(lái)創(chuàng)建不同對(duì)象芯肤,當(dāng)每次都只能通過(guò)構(gòu)造器參數(shù)來(lái)描述創(chuàng)建的對(duì)象纬朝,
靜態(tài)工廠方法 直接通過(guò)方法名來(lái)表示更為清晰。
例:
Date類就有很多重載函數(shù)咐柜,使用不熟悉的話還要查看api才能明白每個(gè)參數(shù)的含義了
而使用靜態(tài)工廠方法徘钥,可以自己修改方法名,讓代碼的編寫和閱讀都更加清晰臭胜。
還有一個(gè)優(yōu)點(diǎn):可以有多個(gè)參數(shù)相同但名稱不同的工廠方法
如果需要通過(guò)相同的參數(shù)類型來(lái)創(chuàng)建不同的對(duì)象時(shí)
比如:
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public Animal(String name, int height) {
this.name = name;
this.height= height;
}
因?yàn)闃?gòu)造器只能通過(guò)參數(shù)類型來(lái)判斷 通常會(huì)采用
public Animal(String name, int age,int height) {
this.name = name;
this.height= height;
}
使用靜態(tài)工廠方法 就不需要為這種事?lián)鷳n录语,使代碼更加簡(jiǎn)化
public static Animal newAnimalWithAge(int age) {
Animal animal = new Animal();
animal.age=age;
return animal;
}
public static Animal newAnimalWithheight(int height) {
Animal animal = new Animal();
animal.height=height;
return animal;
}
2.不用每次被調(diào)用時(shí)都創(chuàng)建新對(duì)象------單例模式
private Animal(){
}
private static Animal cat = new Animal();
public static Animal Cat() {
return cat;
}
3.可以返回原返回類型的子類
public class Animal {
public static Animal getInstanceCat() {
return new Cat();
}
}
class Cat extends Animal{
}
4.在創(chuàng)建帶泛型的實(shí)例時(shí),能使代碼變得簡(jiǎn)潔
這條主要是針對(duì)帶泛型類的繁瑣聲明而說(shuō)的注服,需要重復(fù)書寫兩次泛型參數(shù):
Map<String,List<String>> m= new HashMap<String,List<String>>();
不過(guò)自從 java7 開(kāi)始韭邓,這種方式已經(jīng)被優(yōu)化過(guò)了,可以在創(chuàng)建實(shí)例時(shí)省略掉泛型參數(shù)溶弟。
Map<String,List<String>> m= new HashMap<>();