Java設計模式之工廠模式

什么是工廠模式

工廠模式(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,也是工廠模式一種應用。

好了,工廠模式的介紹到此告一段落了~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容