什么是工廠模式
工廠模式(FactoryPattern),在面向對象程序設計中,工廠通常是用來創建其他對象的對象。
在工廠模式中,創建對象時,不會對客戶端暴露創建邏輯,是通過一個共同的接口來指向新創建的對象。
工廠模式分為:
- 普通工廠模式
- 多個工廠方法模式
- 靜態工廠方法模式
普通工廠模式
為了方便理解,我們以人為例子,有一個工廠可以創建人。先創建一個男人,他每天都會"吃飯,睡覺,打豆豆",再創建一個女人,她也會"吃飯,睡覺,打豆豆"。
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();
}
}
運行結果:
普通工廠模式.png
多個方法工廠模式
在上面的普通工廠模式中,我們看到,如果創建人時,傳遞的字符串出錯,則不能正確創建對象,所以就有了多個方法工廠模式,提供多個工廠方法,分別創建對象。
示例代碼
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();
}
}
運行結果:
多個方法工廠模式.png
靜態工廠方法模式
如果將上面多個方法工廠的模式里的方法改為靜態方法,則不需要創建實例,直接調用即可。
示例代碼
public class HumanFactory {
// 靜態工廠方法模式
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();
}
}
運行結果:
靜態工廠方法模式.png
總結
那么我們在什么時候需要使用工廠模式呢?
當需要創建多個產品時,且具有共同的接口時。通過上面的對比,靜態工廠方法模式使用起來比較方便,高效。所以我們經常會使用它。
工廠模式的實際應用
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的程序員,應該會比較熟悉BitmapFactory,也是工廠模式一種應用。
好了,工廠模式的介紹到此告一段落了~