java設計模式--抽象工廠模式
阿新 • • 發佈:2018-12-04
1 背景
上一章節我們說到了造車,當是客戶經理忘記了一件很重要的事情,忘記車還分手動擋和自動擋了,所有這次就用抽象工廠來實現了。
然後我們就開始分析了,首先當然是車啦,然後各種型號下又分別有手動擋和自動擋
2 UML
程式碼:
/** * 車 * @author pengkun * */ public interface Car { void getCar(); } /** * 秦 * @author pengkun * */ public abstract class QinCar implements Car { @Override public void getCar() { System.out.println("製造了一輛比亞迪秦"); } } public class QinCarSD extends QinCar { @Override public void getCar() { System.out.println("製造了一輛比亞迪秦,手動擋"); } } public class QinCarZD extends QinCar { @Override public void getCar() { System.out.println("製造了一輛比亞迪秦,自動擋"); } } //這裡就寫一種型別了。。其他類似省略了
工廠
public interface AbstractFactoryCar { Car createQin(); Car createTang(); Car createSong(); } /** * 手動擋 * @author pengkun * */ public class SDAbstractFactory implements AbstractFactoryCar { @Override public Car createQin() { return new QinCarSD(); } @Override public Car createTang() { return new TangCarSD(); } @Override public Car createSong() { return new SongCarSD(); } } /** * 自動擋 * @author pengkun * */ public class ZDAbstractFactory implements AbstractFactoryCar { @Override public Car createQin() { return new QinCarZD(); } @Override public Car createTang() { return new TangCarZD(); } @Override public Car createSong() { return new SongCarZD(); } }
測試:
@Test public void test() { AbstractFactoryCar factorySD=new SDAbstractFactory(); AbstractFactoryCar factoryZD=new ZDAbstractFactory(); Car sd1=factorySD.createQin(); Car sd2=factorySD.createTang(); sd1.getCar(); sd2.getCar(); Car zd1=factoryZD.createQin(); Car zd2=factoryZD.createTang(); zd1.getCar(); zd2.getCar(); }
結果:
製造了一輛比亞迪秦,手動擋
製造了一輛比亞迪唐,手動擋
製造了一輛比亞迪秦,自動擋
製造了一輛比亞迪唐,自動擋
總結:
優點
封裝性。每個產品的實現類不是高層模組要關心的,它要關心的是介面,是抽象,它不關心物件是如何創建出來的,這都由工廠類負責的,只要知道工廠類是誰,我就能建立一個需要的物件,省時省力。
缺點
抽象工廠模式最大的缺點就是產品族擴充套件非常困難。如果我們要增加一個產品C,也就是說產品族由原來的A和B增加到3個,那麼我們首先要在抽象類AbstractCreator中增加createProductC()方法,然後兩個實現類都要修改……說到這裡,已經知道了擴充套件的弊端了……
注意這裡是產品族擴充套件比較困難,而不是產品等級擴充套件困難。產品等級擴充套件還是非常容易的,增加一個產品等級,只要增加一個工廠類負責新增加出來的產品生產任務即可。也就是說橫向擴充套件容易,縱向擴充套件難。