工廠模式分爲三種測試
簡單工廠模式對象
須要三個角色:產品抽象類(接口)、產品具體實現類、工廠類接口
/** * 產品抽象接口 * Created by lidongyang on 2017/8/23 0023. */ public interface Car { void driver(); }
/** * 產品具體實現類1:寶馬 * Created by lidongyang on 2017/8/23 0023. */ public class BMW implements Car { public void driver() { System.out.println("我是寶馬"); } }
/** * 產品具體實現類2:奔馳 * Created by lidongyang on 2017/8/23 0023. */ public class Benz implements Car { public void driver() { System.out.println("我是奔馳"); } }
/** * 工廠類 * Created by lidongyang on 2017/8/23 0023. */ public class Factory { public static Car create(String carType){ if ("bmw".equals(carType)){ return new BMW(); } if("benz".equals(carType)){ return new Benz(); } return null; } }
下面是測試類產品
/** * Created by lidongyang on 2017/8/22 0022. */ public class Test { public static void main(String[] args) { Car car = Factory.create("bmw"); car.driver(); } }
從測試類咱們也能夠看出,在咱們須要一輛車的時候,咱們並不須要關心如何去建立這個車,咱們只要告訴工廠,我要寶馬,那麼工廠給咱們的就是寶馬。class
優勢:一、不須要關心對象的具體建立 二、符合開閉原則(對擴展開放,對修改關閉),可是這裏貌似不全對,當咱們若是須要一個馬自達時,再加一個馬自達的實現類就行了,而不須要改變其餘的,這裏實現了對擴展開放。可是工廠類的話,咱們仍是得修改,這違背了對修改關閉這部分原則。爲了解決這個問題,咱們有下面的一種工廠模式基礎
工廠方法模式擴展
有四個角色:工廠抽象類(接口)、具體工廠類、產品抽象類(接口)、具體產品類程序
對於產品抽象類和具體產品類,和上面同樣,這裏不在列代碼,下面看工廠類方法
/** * 工廠接口 * Created by lidongyang on 2017/8/23 0023. */ public interface Factory { Car creat(); }
/** * 工廠實現類一、寶馬工廠 * Created by lidongyang on 2017/8/23 0023. */ public class BMWFactory implements Factory{ public Car creat() { return new BMW(); } }
下面是測試類im
/** * Created by lidongyang on 2017/8/22 0022. */ public class Test { public static void main(String[] args) { Factory factory = new BMWFactory(); Car car = factory.creat(); car.driver(); } }
由此咱們看出,當咱們須要一輛車時,咱們先得有一個對應車品牌的工廠,而後從工廠中拿車,這解決了簡單工廠模式中不知足的「對修改關閉」的問題,假如咱們再次須要馬自達時,只要再加一個馬自達的工廠類、馬自達的產品類,就OK了。可是咱們又遇到一個問題,若是有一天咱們須要100種產品,難道咱們要建100個工廠類嗎?
抽象工廠模式
個人理解抽象工廠模式雖然必定程序上解決了上面的問題,可是它的主要目的不是解決這個問題。
抽象工廠模式,其實就是在上述的基礎上,抽象工廠類(接口)中,不只能生產小轎車,還能夠生產大卡車、還能夠生產吉普車等等,以下
/** * 工廠接口,生產吉普和小轎車 * Created by lidongyang on 2017/8/23 0023. */ public interface Factory { Jeep creatJeep(); Car creatCar(); }
/** * 工廠實現類1,生產奔馳的品牌(奔馳廠) * eated by lidongyang on 2017/8/24 0024. */ public class BenzFactory implements Factory { public Jeep creatJeep() { return new BenzJeep(); } public Car creatCar() { return new Benz(); } }
/** * 工廠實現類二、寶馬工廠 * Created by lidongyang on 2017/8/23 0023. */ public class BMWFactory implements Factory{ public Jeep creatJeep() { return new BMWJeep(); } public Car creatCar() { return new BMW(); } }
綜上所述,其實三種工廠模式,是層層遞進的,總結一下
簡單工廠:產品抽象類(接口)、具體產品類、工廠類
工廠模式:產品抽象類(接口)、具體產品類、工廠類、抽象工廠類(接口)
抽象工廠:產品抽象類(接口)、具體產品類、工廠類、抽象工廠類(接口)
其實抽象工廠就是工廠模式的一個進化。工廠模式的工廠只能生產一種產品,而抽象工廠的工廠能夠生產多種產品。