簡單工廠模式+工廠方法模式+抽象工廠模式

簡單工廠模式+工廠方法模式+抽象工廠模式

簡單工廠模式

    簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解爲是不同工廠模式的一個特殊實現。
簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。

示例代碼如下:
public interface Fruit {
    void description();
}
public class Apple implements Fruit {
    @Override
    public void description() {
        System.out.println("This is an apple");
    }
}
public class Banana implements Fruit {
    @Override
    public void description() {
        System.out.println("This is a banana");
    }
}
public class FruitFactory {
    public static Fruit getFruitInstance(String name){
    switch(name){
        case "apple":
            return new Apple();
        case "banana":
            return new Banana();
            default:
                return null;
    }
    }
}
測試代碼:
public class Test {
    public static void main(String[] args) {
        Fruit fruit=FruitFactory.getFruitInstance("apple");
        fruit.description();
        fruit=FruitFactory.getFruitInstance("banana");
        fruit.description();
    }
}

我們首先抽象出來一個水果接口,具體的水果實現此接口,在工廠方法中根據傳入的參數動態來創建對應的水果對象。我們來分析一下它的缺點,加入我現在要新加一種橘子水果,代碼如下:
public class Orange implements Fruit {
    @Override
    public void description() {
        System.out.println("This is an orange");
    }
}
public class FruitFactory {
    public static Fruit getFruitInstance(String name){
    switch(name){
        case "apple":
            return new Apple();
        case "banana":
            return new Banana();
        case "orange":
            return new Orange();
            default:
                return null;
    }
    }
}
從代碼中可以看到,我們除了加一個橘子的實體,還要在工廠方法中新增創建橘子實體的條件,假如以後還要再加其他的水果,那麼每次就要修改水果工廠方法,顯然這是不可取的,違背了設計原則中的開閉原則(針對擴展開放,針對修改關閉),因此其適用場景在創建對象較少,相對簡單的環境情況下使用。

工廠方法模式

工廠方法模式對簡單工廠模式的不足做了很好的補充,我們來看一下代碼的實現
public interface Fruit {
    void description();
}
public class Apple implements Fruit {
    @Override
    public void description() {
        System.out.println("This is an apple");
    }
}
public class Banana implements Fruit {
    @Override
    public void description() {
        System.out.println("This is a banana");
    }
}
public interface FruitFactory {
    Fruit createFruit();
}
public class AppleFactory implements FruitFactory {
    @Override
    public Fruit createFruit() {
        return new Apple();
    }
}
public class BananaFactory implements FruitFactory {
    @Override
    public Fruit createFruit() {
        return new Banana();
    }
}
測試代碼:
public class Test {

    public static void main(String[] args) {
        FruitFactory fruitFactory=new AppleFactory();
        Fruit fruit=fruitFactory.createFruit();
        fruit.description();

        fruitFactory=new BananaFactory();
        fruit=fruitFactory.createFruit();
        fruit.description();
    }
}
與簡單工廠不同的是,水果工廠也做了抽象,每種水果都有自己的工廠且只創建自己的對象。我們使用的時候創建其水果工廠就可以創建該工廠的水果對象了,如果我們要新加一種水果,代碼如下:
public class Orange implements Fruit {
    @Override
    public void description() {
        System.out.println("This is an orange");
    }
}
public class OrangeFactory implements FruitFactory {
    @Override
    public Fruit createFruit() {
        return new Orange();
    }
}
這樣新增加一種水果就加一個該水果的工廠,不需要修改原有代碼,符合開閉原則,但也有一點不足之處就是類會變得特別多。


抽象工廠模式

抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。上面的工廠方法模式針對的是一個產品等級結構;而抽象工廠模式針對的是多個產品等級結構。它的使用場景是創建一組相關或相互依賴的對象的時候,比如聯想公司生產一套設備有鍵盤,鼠標,電腦;蘋果公司也生產電腦,鍵盤,鼠標。那麼聯想生產的電腦,鼠標,鍵盤都屬於聯想公司的品牌,這些設備和聯想公司都是相關的,即可稱之爲一個產品族。
下面還拿水果來做示例
public interface Fruit {
    void description();
}
public class Apple implements Fruit {
    @Override
    public void description() {
        System.out.println("This is an apple");
    }
}
public class Banana implements Fruit {
    @Override
    public void description() {
        System.out.println("This is a banana");
    }
}
public class ImportedApple implements Fruit {
    @Override
    public void description() {
        System.out.println("This is a imported apple");
    }
}
public class ImportedBanana implements Fruit {
    @Override
    public void description() {
        System.out.println("This is a imported banana");
    }
}
public interface FruitFactory {
    Fruit createApple();
    Fruit CreateBanana();
}
public class ChinaFactory implements FruitFactory {
    @Override
    public Fruit createApple() {
        return new Apple();
    }

    @Override
    public Fruit CreateBanana() {
        return new Banana();
    }
}
public class ImportedFactory implements FruitFactory {
    @Override
    public Fruit createApple() {
        return new ImportedApple();
    }

    @Override
    public Fruit CreateBanana() {
        return new ImportedBanana();
    }
}
public class Test {

    public static void main(String[] args) {
        FruitFactory fruitFactory=new ChinaFactory();
        Fruit fruit=fruitFactory.createApple();
        fruit.description();
        fruitFactory=new ImportedFactory();
        fruit=fruitFactory.createApple();
        fruit.description();
    }
}

測試代碼:


這裏我們除了國內廠商的水果外,新增了進口水果產品,進口水果也包含了蘋果,香蕉等,其組成了進口產品族,在工廠對象裏,我們抽象出了一個工廠接口提供了蘋果和香蕉的產品,國內廠商實現了抽象接口,提供了國產的蘋果和香蕉產品,進口的廠商實現了抽象接口,提供了進口的蘋果和香蕉產品,我們在使用的時候,如果去的是國內的廠商,那麼得到的就是國內的水果產品,如果去的是國外的廠商,那麼得到的就是進口的水果產品。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章