我在學習工廠模式時不理解的一點就是工廠模式中也介紹到了抽象工廠。但抽象工廠模式又屬於設計模式的一種,因此我有些想不通,以下是我經過查詢資料及我的理解,描述以下:java
首先來看看這二者的定義區別:設計模式
再來看看工廠方法模式與抽象工廠模式對比:ide
工廠方法模式學習 |
抽象工廠模式spa |
針對的是一個產品等級結構 | 針對的是面向多個產品等級結構 |
一個抽象產品類 | 多個抽象產品類 |
能夠派生出多個具體產品類 | 每一個抽象產品類能夠派生出多個具體產品類 |
由此我的認爲這個取決於產品,若是產品單一,最合適用工廠模式,可是若是有多個產品、業務分類時,經過抽象工廠模式產生須要的對象是一種很是好的解決方式。再通俗深化理解下:工廠模式針對的是一個產品結構 ,而抽象工廠模式針對的是多個產品結構。也能夠理解爲抽象工廠模式是工廠方法模式的多產品升級版。工廠模式其實沒多難,最難的就是什麼狀況使用工廠模式,若是使用的不恰當無形中增長了代碼可讀性、可維護性。設計
工廠模式可分爲三類:code
1)簡單工廠模式(Simple Factory)
2)工廠方法模式(Factory Method)
3)抽象工廠模式(Abstract Factory)對象
在《java設計模式之禪》一書中將工廠模式分爲兩類:工廠方法模式(Factory Method)與抽象工廠模式(Abstract Factory)。將簡單工廠模式(Simple Factory)看爲工廠方法模式的一種特例,二者歸爲一類。 繼承
無工廠模式接口
在沒有工廠時期,若是用戶想開車,通常的作法是客戶去建立一款車,而後拿來用。
簡單工廠模式
客戶有一個工廠來幫他生產車.想要什麼車,這個工廠就能夠幫他生產。 簡單工廠模式又稱靜態工廠方法模式
代碼清單:汽車總稱
public interface CarService { public void model(); }
代碼清單:汽車寶馬
public class BWMServiceImpl implements CarService { @Override public void model() { System.out.println("個人名字叫寶馬"); } }
代碼清單:汽車福特
public class FordServiceImpl implements CarService { @Override public void model() { System.out.println("個人名字叫福特"); } }
代碼清單:汽車Mini
public class MINIServiceImpl implements CarService { @Override public void model() { System.out.println("個人名字叫mini"); } }
代碼清單:人類建立工廠(工廠內部結構)
public class CarFactory { public static <T extends CarService> T CreateCar(Class<T> c) { CarService car = null; try { //生產一個車 car = (T) Class.forName(c.getName()).newInstance(); }catch (Exception e) { System.out.println("汽車生產錯誤"); } return (T) car; } }
代碼清單:工廠生產
如今汽車實現類有了,工廠有了。剩下的工做就差管理給下命令讓工廠開始生產
public class Mannger { public static void main(String[] args) { //生產寶馬 CarService bwmService = CarFactory.CreateCar(BWMServiceImpl.class); bwmService.model(); //生產Mini CarService miniService = CarFactory.CreateCar(MINIServiceImpl.class); miniService.model(); //生產福特 CarService fordService = CarFactory.CreateCar(FordServiceImpl.class); fordService.model(); } }
讓咱們運行下,結果以下:
個人名字叫寶馬 個人名字叫mini 個人名字叫福特
工廠方法模式
在簡單工廠模式的基礎上作兩處修改變可成爲工廠方法模式。
代碼清單:定義抽象工廠
public abstract class CarFactoryBase { public abstract <T extends CarService> T CreateCar(Class<T> c); }
代碼清單:繼承抽象工廠
去掉static繼承抽象工廠
public class CarFactory extends CarFactoryBase { @Override public <T extends CarService> T CreateCar(Class<T> c) { CarService car = null; try { car = (T) Class.forName(c.getName()).newInstance(); }catch (Exception e) { e.printStackTrace(); } return (T) car; } }
代碼清單:工廠方法生產
public class Mannger { public static void main(String[] args) { CarFactoryBase car= new CarFactory(); CarService bwmService = car.CreateCar(BWMServiceImpl.class); bwmService.model(); CarService miniService = car.CreateCar(MINIServiceImpl.class); miniService.model(); CarService fordService = car.CreateCar(FordServiceImpl.class); fordService.model(); } }
輸出結果與簡單工廠模式同樣
個人名字叫寶馬 個人名字叫mini 個人名字叫福特
抽象工廠模式
抽象工廠會在接下來的博客中編寫。