1. 程式人生 > 實用技巧 >java設計模式(二)——工廠模式

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("備英語課");
    }

    @Override
    
public 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();
    }
}