什么是工廠模式
工廠模式(FactoryPattern)嘉汰,在面向?qū)ο蟪绦蛟O(shè)計中皿曲,工廠通常是用來創(chuàng)建其他對象的對象。
在工廠模式中粤铭,創(chuàng)建對象時,不會對客戶端暴露創(chuàng)建邏輯杂靶,是通過一個共同的接口來指向新創(chuàng)建的對象梆惯。
工廠模式分為:
- 普通工廠模式
- 多個工廠方法模式
- 靜態(tài)工廠方法模式
普通工廠模式
為了方便理解,我們以人為例子吗垮,有一個工廠可以創(chuàng)建人垛吗。先創(chuàng)建一個男人,他每天都會"吃飯烁登,睡覺怯屉,打豆豆",再創(chuàng)建一個女人饵沧,她也會"吃飯锨络,睡覺,打豆豆"狼牺。
Interface : void eat(); void sleep(); void beat();
Class Male: void eat(); void sleep(); void beat();
Class Female: void eat(); void sleep(); void beat();
Class HumanFactory: createHuman(String ) : Human
示例代碼
public interface Human {
public void eat();
public void sleep();
public void beat();
}
public class Male implements Human{
@Override
public void eat() {
System.out.println("Male can eat.");
}
@Override
public void sleep() {
System.out.println("Male can sleep.");
}
@Override
public void beat() {
System.out.println("Male can beat.");
}
}
public class Female implements Human{
@Override
public void eat() {
System.out.println("Female can eat.");
}
@Override
public void sleep() {
System.out.println("Female can sleep.");
}
@Override
public void beat() {
System.out.println("Female can beat.");
}
}
public class HumanFactory {
// 普通工廠模式
public Human createHuman(String gender) {
if (gender.equals("male")) {
return new Male();
} else if (gender.equals("female")) {
return new Female();
} else {
System.out.println("請輸入正確的類型");
return null;
}
}
}
public class FactoryTest {
public static void main(String[] agrs) {
HumanFactory factory = new HumanFactory();
Human male = factory.createHuman("male");
male.eat();
male.sleep();
male.beat();
}
}
運(yùn)行結(jié)果:
普通工廠模式.png
多個方法工廠模式
在上面的普通工廠模式中羡儿,我們看到,如果創(chuàng)建人時是钥,傳遞的字符串出錯掠归,則不能正確創(chuàng)建對象,所以就有了多個方法工廠模式悄泥,提供多個工廠方法虏冻,分別創(chuàng)建對象。
示例代碼
public class HumanFactory {
//多個工廠方法模式
public Male createMale() {
return new Male();
}
public Female createFemale() {
return new Female();
}
}
public class FactoryTest {
public static void main(String[] agrs) {
HumanFactory factory = new HumanFactory();
Male male = factory.createMale();
male.eat();
male.sleep();
male.beat();
}
}
運(yùn)行結(jié)果:
多個方法工廠模式.png
靜態(tài)工廠方法模式
如果將上面多個方法工廠的模式里的方法改為靜態(tài)方法弹囚,則不需要創(chuàng)建實例厨相,直接調(diào)用即可。
示例代碼
public class HumanFactory {
// 靜態(tài)工廠方法模式
public static Male createMale() {
return new Male();
}
public static Female createFemale() {
return new Female();
}
}
public class FactoryTest {
public static void main(String[] agrs) {
Human female = HumanFactory.createFemale();
female.eat();
female.sleep();
female.beat();
}
}
運(yùn)行結(jié)果:
靜態(tài)工廠方法模式.png
總結(jié)
那么我們在什么時候需要使用工廠模式呢?
當(dāng)需要創(chuàng)建多個產(chǎn)品時领铐,且具有共同的接口時悯森。通過上面的對比,靜態(tài)工廠方法模式使用起來比較方便绪撵,高效瓢姻。所以我們經(jīng)常會使用它。
工廠模式的實際應(yīng)用
Calender對象
java.util.Calender - getINstance()
java.util.Calendar - getInstance(TimeZone zone)
java.util.Calendar - getInstance(Locale aLocale)
java.util.Calendar - getInstance(TimeZone zone, Locale aLocale)
java.text.NumberFormat - getInstance()
java.text.NumberFormat - getInstance(Locale inLocale)
Android的程序員音诈,應(yīng)該會比較熟悉BitmapFactory幻碱,也是工廠模式一種應(yīng)用。
好了细溅,工廠模式的介紹到此告一段落了~