設計模式(二)工廠模式

版權聲明:轉載必須註明本文轉自曉_晨的博客:http://blog.csdn.net/niunai112

目錄

導航

設計模式之六大設計原則
設計模式(一)單例模式
設計模式(二)工廠模式
設計模式(三)策略模式
設計模式(四)適配器模式
設計模式(五)享元模式
設計模式(六)建造者模式
設計模式(七)原型模式
設計模式(八)橋接模式
設計模式(九)外觀模式
設計模式(十)組合模式
設計模式(十一)裝飾器模式
設計模式(十二)代理模式
設計模式(十三)迭代器模式
設計模式(十四)觀察者模式
設計模式(十五)中介者模式
設計模式(十六)命令模式
設計模式(十七)狀態模式
設計模式(十八)訪問者模式
設計模式(十九)責任鏈模式
設計模式(二十)解釋器模式
設計模式(二十一)備忘錄模式
設計模式(二十二)模板模式
設計模式總結篇(爲什麼要學習設計模式,學習設計模式的好處)

前言

工廠模式提供了一種創建對象的方式,需要生成的對象叫做產品 ,生廠對象的地方叫做工廠 。通過這種方法可以讓你的代碼可維護性更好。

沒有使用設計模式

假如一家店有二種披薩,海鮮披薩和牛肉味的披薩,然後我們創建出下面這樣的類, 那麼每次當客人需要某種口味的披薩的時候,客人就要實例化相關的類。這樣客人就和披薩關聯到了一起。耦合度太高。

    class SeafoodPizza{
        String flavor = "Seafood";

    }
    class BeefPizza{

        String flavor = "beef";

    }

工廠模式的目的在於程序的可擴展性。

簡單工廠模式

是爲了讓程序有一個更好地封裝,降低程序模塊之間的耦合程度。(簡單工廠模式不是23種設計模式中的一種)

這樣只要通過PizzaStore的getPizza,傳入口味,就可以得到一個相關口味的披薩實例了。

public interface Pizza {
}
public class BeefPizza implements Pizza{
    String flavor = "beef";
}
public class SeafoodPizza implements Pizza {
    String flavor = "Seafood";
}

public class PizzaStore {

    public Pizza getPizza(String flavor){
        Pizza pz = null;
        if (flavor.equals("Seafood")){
            pz = new SeafoodPizza();

        } else if (flavor.equals("Beef")){
            pz = new BeefPizza();
        }
        return pz;
    }


}

工廠模式

工廠方法模式組成:
1)抽象工廠角色: 這是工廠方法模式的核心,它與應用程序無關。是具體工廠角色必須實現的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現。
2)具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程序調用以創建對應的具體產品的對象。
3)抽象產品角色:它是具體產品繼承的父類或者是實現的接口。在java中一般有抽象類或者接口來實現。
4)具體產品角色:具體工廠角色所創建的對象就是此角色的實例。在java中由具體的類來實現。
當有新的產品添加的時候,不必修改已有的代碼,只要拓展類就行了,符合開閉原則,但是當披薩種類不斷變多的時候,就會有很多的工廠實現類和產品類。


public interface IPizzaStore {
       Pizza getPizza();
}
public class BeefPizzaStore implements IPizzaStore{
    @Override
   public Pizza getPizza() {
        return new BeefPizza();
   }
}
public class SeafoodPizzaStore implements IPizzaStore{
    @Override
    public Pizza getPizza() {
        return new SeafoodPizza();
    }
}
public interface Pizza {
}
public class BeefPizza implements Pizza{
    String flavor = "beef";
}
public class SeafoodPizza implements Pizza {
    String flavor = "Seafood";
}

抽象工廠模式

當有多個工廠有多個產品簇的時候,這個時候就要採用抽象工廠模式了。這裏我們假設有兩個牌子,有一個叫第一牌(First),有一個叫第二牌(Second)。然後他們都能賣pizza和drink

public interface Drink {
}
public class FirstDrink implements Drink {
}
public class SecondDrink implements Drink {
}
public interface Pizza {
}
public class FirstPizza implements Pizza {
}
public class SecondPizza implements Pizza {
}

abstract class Factory {
    abstract Drink getDrink();
    abstract Pizza getPizza();

}

public class FirstStore extends Factory {
    @Override
    Drink getDrink() {
        return new FirstDrink();
    }

    @Override
    Pizza getPizza() {
        return new FirstPizza();
    }
}
public class SecondStore extends Factory {
    @Override
    Drink getDrink() {
        return new SecondDrink();
    }

    @Override
    Pizza getPizza() {
        return new SecondPizza();
    }
}

這樣就實現了抽象工廠模式,有一個抽象的工廠,具體的實現類來實現抽象工廠的方法。有產品的接口,各個具體的產品實現產品接口,然後每個具體的工廠可以生產出他旗下的產品。

    public static void main(String[] args) {
        Factory fir = new FirstStore();
        Drink firDrink = fir.getDrink();
        Pizza firPizza = fir.getPizza();
        Factory sec = new SecondStore();
        Drink secDrink = sec.getDrink();
        Pizza secPizza = sec.getPizza();
    }

當我們要增加一個廠家的時候,即增加一個披薩商店牌子(Third),就要增加一組ThirdStore,ThirdDrink,ThridPizza。
假如要增加一個產品,如麪條,noodles,那就要增加一個noodles接口,增加一組FirNoodles,SecNoodles實現類,工廠抽象方法要加一個getNoodles抽象方法,每個實現類都實現getNoodles方法。

其實工廠模式,抽象工廠模式,並沒有減少我們碼代碼的工作量,相反還增加了工作量,但是通過抽象工廠模式,我們能使對象之間的耦合程度大大減少,而且我們日後維護代碼也更加方便。

Git地址

本篇實例Github地址:https://github.com/stackisok/Design-Pattern/tree/master/src/factory
抽象工廠:https://github.com/stackisok/Design-Pattern/tree/master/src/abFactory

回到最上方


有什麼不懂或者不對的地方,歡迎留言。
喜歡LZ文章的小夥伴們,可以關注一波,也可以留言,LZ會回你們的。
覺得寫得不錯的小夥伴,歡迎轉載,但請附上原文地址,謝謝^_^!

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