java設計模式(二)——工廠模式
工廠模式屬於創造型模式:
物件不再使用者去呼叫,而是交由工廠去建立。
例如:我們想要吃烤鴨,如果自己做的話,那麼需要買鴨,處理鴨,烤,放作料等一些列過程。
而如果我們去餐廳去買的話,我們就不需要關心怎麼去做的,由飯店給我們做,它給我們做好的鴨子即可。
工廠模式屬於創造型的模式,三種形式:簡單工廠,工廠方法,抽象工廠,
每種工廠都有它的優缺點,看合適的場景去使用。
1、簡單工廠:適用於建立物件少,不經常變,使用者無需在意物件的建立過程,簡單容易理解。
案例:
類圖:
介面:Icource
/** * @date 2020/6/30 */ public interface Icource {//備課 void prepareCource(); //教學 void teach(); //批改作業 void correctiveWork(); }
實現類:MathCource
/** * @date 2020/6/30 */ public class MathCource implements Icource { @Override public void prepareCource() { System.out.println("備數學課"); } @Override public void teach() { System.out.println("數學教學"); } @Override public void correctiveWork() { System.out.println("批改數學作業"); } }
實現類:EnglishCource
/** * @date 2020/6/30 */ public class EnglishCource implements Icource { @Override public void prepareCource() { System.out.println("備英語課"); } @Overridepublic void teach() { System.out.println("英語教學"); } @Override public void correctiveWork() { System.out.println("批改英語作業"); } }
簡單工廠:
/** * @date 2020/6/30 */ public class CourceSimpleFactory { public static Icource createCource(String type){ Icource icource = null; if("math".equals(type)){ icource = new MathCource(); }else if("english".equals(type)){ icource = new EnglishCource(); } return icource; } }
測試類:
/** * @date 2020/6/30 */ public class Test { public static void main(String[] args) { Icource icource = CourceSimpleFactory.createCource("math"); icource.prepareCource(); icource.teach(); icource.correctiveWork(); } }
2、工廠方法:
上面的簡單工廠雖然用法簡單,但不利於擴充套件。當我們新增一個語文課時,我們需要修改簡單工廠的程式碼,這不符合開閉原則,而且當
簡單工廠建立的物件經常改變,種類繁多時,也就不符合單一職責。這時候工廠方法就有了,它符合開閉原則,職能單一原則。
建立的物件多,讓系統程式碼結構更為複雜。
案例:
類圖:
課程介面Icource:
/** * @date 2020/6/30 */ public interface Icource { //備課 void prepareCource(); //教學 void teach(); //批改作業 void correctiveWork(); }
實現類MathCource :
/** * @date 2020/6/30 */ public class MathCource implements Icource { @Override public void prepareCource() { System.out.println("備數學課"); } @Override public void teach() { System.out.println("數學教學"); } @Override public void correctiveWork() { System.out.println("批改數學作業"); } }
實現類EnglishCource:
/** * @date 2020/6/30 */ public class EnglishCource implements Icource { @Override public void prepareCource() { System.out.println("備英語課"); } @Override public void teach() { System.out.println("英語教學"); } @Override public void correctiveWork() { System.out.println("批改英語作業"); } }
工廠介面IcourceFactory:
/** * @date 2020/6/30 */ public interface IcourceFactory { Icource createInstance(); }
實現工廠介面類EnglishFactory:
/** * @date 2020/6/30 */ public class EnglishFactory implements IcourceFactory{ @Override public Icource createInstance() { return new EnglishCource(); } }
實現工廠介面類:MathFacotry
/** * @date 2020/6/30 */ public class MathFacotry implements IcourceFactory { @Override public Icource createInstance() { return new MathCource(); } }
測試類:
/** * @date 2020/6/30 */ public class Test { public static void main(String[] args) { IcourceFactory icourceFactory = new EnglishFactory(); Icource instance = icourceFactory.createInstance(); instance.correctiveWork(); } }
3、抽象工廠:提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類,適用於產品族
缺點:結構較複雜,理解難度大,當工廠新增一個產品時,需要修改工廠的方法,不符合開閉原則。
案例:現有三個工廠類:小米工廠,格力工廠,美的工廠
小米工廠:生產空調,洗衣機,榨汁機,這三個就可以是一個產品族了
格力工廠:生產空調,洗衣機,榨汁機
美的工廠:生產空調,洗衣機,榨汁機
抽象工廠:定義三個抽象方法
類圖:
抽象工廠AbstractFactory:
/** * @date 2020/6/30 */ public abstract class AbstractFactory { protected abstract IAirConditioning createAirConditioning(); protected abstract IJuicer createJuicer(); protected abstract IWashingMachine createWashingMachine(); }
抽象工廠繼承類XiaomiFactory:
/** * @date 2020/6/30 */ public class XiaomiFactory extends AbstractFactory { @Override protected IAirConditioning createAirConditioning() { return new XiaomiAirConditioning(); } @Override protected IJuicer createJuicer() { return new XiaomiJuicer(); } @Override protected IWashingMachine createWashingMachine() { return new XiaomiWashingMachine(); } }
抽象工廠繼承類MideaFactory:
/** * @date 2020/6/30 */ public class MideaFactory extends AbstractFactory { @Override protected IAirConditioning createAirConditioning() { return new MideaAirConditioning(); } @Override protected IJuicer createJuicer() { return new MideaJuicer(); } @Override protected IWashingMachine createWashingMachine() { return new MideaWashingMachine(); } }
抽象工廠繼承類GreenFactory:
/** * @date 2020/6/30 */ public class GreenFactory extends AbstractFactory { @Override protected IAirConditioning createAirConditioning() { return new GreenAirConditioning(); } @Override protected IJuicer createJuicer() { return new GreenJuicer(); } @Override protected IWashingMachine createWashingMachine() { return new GreenWashingMachine(); } }
空調介面IAirConditioning:
/** * @date 2020/6/30 */ public interface IAirConditioning { void refrigeration(); }
其實現類XiaomiAirConditioning:
/** * @date 2020/6/30 */ public class XiaomiAirConditioning implements IAirConditioning { @Override public void refrigeration() { System.out.println("小米空調"); } }
其實現類MideaAirConditioning:
/** * @date 2020/6/30 */ public class MideaAirConditioning implements IAirConditioning { @Override public void refrigeration() { System.out.println("美的空調"); } }
其實現類GreenAirConditioning:
/** * @date 2020/6/30 */ public class GreenAirConditioning implements IAirConditioning { @Override public void refrigeration() { System.out.println("格力空調"); } }
洗衣機介面IWashingMachine:
/** * @date 2020/6/30 */ public interface IWashingMachine { void washClothes(); }
其實現類XiaomiWashingMachine:
/** * @date 2020/6/30 */ public class XiaomiWashingMachine implements IWashingMachine { @Override public void washClothes() { System.out.println("小米洗衣機"); } }
其實現類MideaWashingMachine :
/** * @date 2020/6/30 */ public class MideaWashingMachine implements IWashingMachine { @Override public void washClothes() { System.out.println("美的洗衣機"); } }
其實現類GreenWashingMachine:
/** * @date 2020/6/30 */ public class GreenWashingMachine implements IWashingMachine { @Override public void washClothes() { System.out.println("格力洗衣機"); } }
榨汁機介面IJuicer:
/** * @date 2020/6/30 */ public interface IJuicer { void juicing(); }
其實現類XiaomiJuicer:
/** * @date 2020/6/30 */ public class XiaomiJuicer implements IJuicer { @Override public void juicing() { System.out.println("小米榨汁機"); } }
其實現類MideaJuicer:
/** * @date 2020/6/30 */ public class MideaJuicer implements IJuicer { @Override public void juicing() { System.out.println("美的空調"); } }
其實現類MideaJuicer:
/** * @date 2020/6/30 */ public class GreenJuicer implements IJuicer { @Override public void juicing() { System.out.println("格力榨汁機"); } }
其實現類GreenJuicer:
/** * @date 2020/6/30 */ public class GreenJuicer implements IJuicer { @Override public void juicing() { System.out.println("格力榨汁機"); } }
測試類:
/** * @date 2020/6/30 */ public class Test { public static void main(String[] args) { AbstractFactory factory = new GreenFactory(); factory.createAirConditioning().refrigeration(); } }