設計模式系列(四)---工廠模式

設計模式系列(四)---工廠模式

目錄

工廠模式的種類

  • 工廠模式分爲兩類:工廠方法模式和抽象工廠模式
  • 簡單工廠是工廠方法模式的一種特例

簡單工廠模式

代碼實現

abstract class Person
{
    public abstract void sayHello();
}

class GDPerson extends Person
{
    public void sayHello()
    {
        System.out.println("我是廣東人");
    }
}

class BJPerson extends Person
{
    public void sayHello()
    {
        System.out.println("我是北京人");
    }
}
class PersonFactory
{
    static final int GD=1;
    static final int BJ=2;
    public static Person createPerson(int area)
    {
        switch (area)
        {
            case GD:
                return new GDPerson();
            case BJ:
                return new BJPerson();
            default:
                return null;
        }
    }
}
public class Demo5 {
    public static void main(String[] args) {
        Person gdPerson=PersonFactory.createPerson(PersonFactory.GD);
        gdPerson.sayHello();
        Person bjPerson=PersonFactory.createPerson(PersonFactory.BJ);
        bjPerson.sayHello();
    }
}

開放封閉原則

  • 開放封閉原則是面向對象原則的核心
  • 對擴展開放,意味着需求或變化是們能夠對現有代碼進行擴展,以適應新的狀況
  • 對修改封閉,意味這類一旦設計完成,就能夠獨立完成其工做,而不要對類進行任何修改

分析

  • 傳入要建立的對象的類型,然根據傳入的類型,建立相應的對象
  • 調用者沒必要知道對象是如何建立的,只要傳入相應的參數就能夠html

  • 可是,若是這個時候須要添加其餘的type,那麼就要增長case,也就是對設計完成的類進行修改,而這樣就違背了開放封閉原則設計模式

工廠方法模式

代碼實現

public interface PersonFactory
{
    Person createPerson();
}
class GDFactory implements PersonFactory
{

    public Person createPerson() {
        return new GDPerson();
    }
    
}
class BJFactory implements PersonFactory
{
    public Person createPerson()
    {
        return new BJPerson();
    }
}

public class Demo5 {
    public static void main(String[] args) {
        PersonFactory gdFactory=new GDFactory();
        Person gdPerson=gdFactory.createPerson();
        PersonFactory bjFactory=new BJFactory();
        Person bjPerson=bjFactory.createPerson();
        
    }
}

分析

  • 定義一個用於建立對象的接口,讓子類決定實例化哪一個類,在這裏體現爲建立一個PersonFactory接口,根據要實例化的類(Person的類型),建立實現這個接口的一個工廠類(BJFactory或者是GDFactory)。
  • 這樣的話,當增長一個新的類的時候,不用對一個已經設計完成的類進行修改,這樣就不會破壞開放封閉原則。
  • 可是隨着類的增多(好比SHPeroson和USAPerson),那麼就要對應建立多個工廠類

抽象工廠模式

abstract class Animal
{
    public abstract void sayHello();
}

class Cat extends Animal
{
    public void sayHello()
    {
        System.out.println("瞄");
    }
}
public interface Factory
{
    Person createPerson();
    Animal createAnimal();
}

class Factory1 implements Factory
{
    public Person createPerson()
    {
        return new BJPerson();
    }
    public Animal createAnimal()
    {
        return new Cat();
    }
}

分析

  • 對比工廠方法模式。它與工廠方法惟一的區別就是工廠的接口裏是再也不是建立一個類型(不止是Person還有Animal)。

對比

  • 能夠體會到,建立一個實例的時候,咱們將判斷的邏輯放到工程的類的內部(switch或者if else)。而工廠方法模式的話,則是將判斷的邏輯轉移到客戶端,要建立什麼類型的實例,就建立對應的工廠來獲取對象。

我以爲分享是一種精神,分享是個人樂趣所在,不是說我以爲我講得必定是對的,我講得可能不少是不對的,可是我但願我講的東西是我人生的體驗和思考,是給不少人反思,也許給你一秒鐘、半秒鐘,哪怕說一句話有點道理,引起本身心裏的感觸,這就是我最大的價值。(這是我喜歡的一句話,也是我寫博客的初衷)

做者:jiajun 出處: http://www.cnblogs.com/-new/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。若是以爲還有幫助的話,能夠點一下右下角的【推薦】,但願可以持續的爲你們帶來好的技術文章!想跟我一塊兒進步麼?那就【關注】我吧。設計

相關文章
相關標籤/搜索