java設計模式2————工廠模式

java設計模式2————工廠模式

一、工廠模式介紹:

1.一、實現了建立者與調用者的分離

1.二、詳細分類:

  • 簡單工廠模式
  • 工廠方法模式
  • 抽象工廠模式

1.三、所遵循的OOP原則:

  • 開閉原則:對擴展開放,對修改關閉
  • 依賴倒轉原則:面向接口編程
  • 迪米特法則:只與你直接的朋友進行通訊,而避免與陌生人進行通訊。

1.四、核心本質

  • 實例化對象,不使用new,用工廠方法代替
  • 將調用者與咱們的實現類解耦

1.五、三種模式

二、簡單工廠模式

2.一、先創建汽車抽象類

package com.xgp.company.第二種_工廠模式.簡單工廠模式;

public interface Car {

    void name();
}

2.二、製造車

製造「五凌」車

package com.xgp.company.第二種_工廠模式.簡單工廠模式;

public class WuLing implements Car {
    @Override
    public void name() {
        System.out.println("五凌宏觀");
    }
}

製造「特斯拉」車

package com.xgp.company.第二種_工廠模式.簡單工廠模式;

public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

2.三、建立汽車工廠(兩種方式工廠製造對像)

package com.xgp.company.第二種_工廠模式.簡單工廠模式;
/**
 * 簡單工廠模式,又成爲靜態工廠模式
 * 弊端:增長一個新產品時,若是你不修改代碼,作不到
 */

/**
 * 汽車工廠
 */
public class CarFactory {
    public static Car getCar(String car) {
        if("五凌".equals(car)) return new WuLing();
        if("特斯拉".equals(car)) return new Tesla();
        return null;
    }

    /**
     * 第二種方式
     * @return
     */
    public static Car getWuLing() {
        return new WuLing();
    }

    public static Car getTesla() {
        return new Tesla();
    }
}

2.四、創建買車類(傳統方法建立對象被註釋了和經過工廠建立對象)

package com.xgp.company.第二種_工廠模式.簡單工廠模式;

/**
 * 買車
 */
public class Consumer {
/*    *//**
     * 傳統的方式
     * @param args
     *//*
    public static void main(String[] args) {
        //弊端:須要瞭解接口和全部的實現類
        Car car1 = new WuLing();
        Car car2 = new Tesla();

        car1.name();
        car2.name();
    }*/

    /**
     * 簡單工廠模式
     * @param args
     */
    public static void main(String[] args) {
        Car car1 = CarFactory.getCar("五凌");
        Car car2 = CarFactory.getCar("特斯拉");

        car1.name();
        car2.name();
    }
}

2.五、缺點:若是要增長一個「大衆」的汽車,還須要修改工廠代碼

package com.xgp.company.第二種_工廠模式.簡單工廠模式;

/**
 * 弊端:增長實現類時須要改工廠類的代碼
 */
public class Dazhong implements Car {
    @Override
    public void name() {
        System.out.println("大衆");
    }
}

2.六、運行結果

五凌宏觀
特斯拉

2.七、UML類圖

三、工廠方法模式

3.一、創建汽車抽象類

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public interface Car {

    void name();
}

3.二、建立車

建立「五凌」車

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public class WuLing implements Car {
    @Override
    public void name() {
        System.out.println("五凌宏觀");
    }
}

建立「特斯拉」車

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

3.三、建立汽車工廠的抽象類

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public interface CarFactory {
    Car getCar();
}

3.四、建立汽車工廠

建立製造「五凌」車的汽車工廠

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public class WuLingFactory implements CarFactory {

    @Override
    public Car getCar() {
        return new WuLing();
    }
}

建立製造「特斯拉」車的汽車工廠

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public class TeslaFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

3.五、新增一輛「大衆」車

新增一輛「大衆」車

package com.xgp.company.第二種_工廠模式.工廠方法模式;

/**
 * 弊端:增長實現類時須要改工廠類的代碼
 */
public class Dazhong implements Car {
    @Override
    public void name() {
        System.out.println("大衆");
    }
}

新增一輛「大衆」車的汽車工廠

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public class DazhongFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Dazhong();
    }
}

3.六、建立消費者類

package com.xgp.company.第二種_工廠模式.工廠方法模式;

/**
 * 買車
 */
public class Consumer {
    public static void main(String[] args) {
        Car car1 = new WuLingFactory().getCar();
        Car car2 = new TeslaFactory().getCar();
        Car car3 = new DazhongFactory().getCar();

        car1.name();
        car2.name();
        car3.name();
    }

    //根據設計原則:工廠方法模式
    //更據實際業務:簡單工廠模式
}

3.七、弊端:增長實現類時須要改工廠類的代碼

總結:

根據設計原則:工廠方法模式

更據實際業務:簡單工廠模式

3.八、UML類圖

四、小節

五、抽象工廠模式

5.一、該模式介紹

5.二、UML類圖設計

5.三、建立生產產品種類的抽象類

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

/**
 * 抽象產品工廠
 */
public interface IProductFactory {
    //生產手機
    IPhoneProduct iphoneProduct();

    //生產路由器
    IRouterProduct routerProduct();
}

5.四、建立手機和路由器的抽象接口

手機:

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

/**
 * 手機接口
 */
public interface IPhoneProduct {
    void start();       //開機
    void shutdown();    //關機
    void callup();      //打電話
    void sendSMS();     //發短信
}

路由器:

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

/**
 * 路由器產品接口
 */
public interface IRouterProduct {
    void start();       //開機
    void shutdown();    //關機
    void openWifi();    //打開網絡
    void setting();     //設置參數
}

5.五、建立小米工廠

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

public class XiaomiFactory implements IProductFactory {
    @Override
    public IPhoneProduct iphoneProduct() {
        return new XiaomiPhone();
    }

    @Override
    public IRouterProduct routerProduct() {
        return new XiaomiRouter();
    }
}

5.六、小米工廠製造小米手機、小米路由器

製造小米手機:

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

/**
 * 小米手機
 */
public class XiaomiPhone implements IPhoneProduct {
    @Override
    public void start() {
        System.out.println("開啓小米手機");
    }

    @Override
    public void shutdown() {
        System.out.println("關閉小米手機");
    }

    @Override
    public void callup() {
        System.out.println("小米打電話");
    }

    @Override
    public void sendSMS() {
        System.out.println("小米發短信");
    }
}

製造小米路由器:

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

/**
 * 小米路由器
 */
public class XiaomiRouter implements IRouterProduct {
    @Override
    public void start() {
        System.out.println("開啓小米路由器");
    }

    @Override
    public void shutdown() {
        System.out.println("關閉小米路由器");
    }

    @Override
    public void openWifi() {
        System.out.println("小米網絡");
    }

    @Override
    public void setting() {
        System.out.println("小米參數");
    }

}

5.七、建立華爲工廠

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

public class HuaweiFactory implements IProductFactory {
    @Override
    public IPhoneProduct iphoneProduct() {
        return new HuaweiPhone();
    }

    @Override
    public IRouterProduct routerProduct() {
        return new HuaweiRouter();
    }
}

5.八、華爲工廠製造華爲手機、華爲路由器

製造華爲手機:

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

/**
 * 華爲手機
 */
public class HuaweiPhone implements IPhoneProduct {

    @Override
    public void start() {
        System.out.println("開啓華爲手機");
    }

    @Override
    public void shutdown() {
        System.out.println("關閉華爲手機");
    }

    @Override
    public void callup() {
        System.out.println("華爲手機打電話");
    }

    @Override
    public void sendSMS() {
        System.out.println("華爲手機發短信");
    }
}

製造華爲路由器:

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

public class HuaweiRouter implements IRouterProduct {
    @Override
    public void start() {
        System.out.println("開啓華爲路由器");
    }

    @Override
    public void shutdown() {
        System.out.println("關閉華爲路由器");
    }

    @Override
    public void openWifi() {
        System.out.println("華爲網絡");
    }

    @Override
    public void setting() {
        System.out.println("華爲參數");
    }
}

5.九、根據工廠製造產品

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

public class Client {
    public static void main(String[] args) {
        System.out.println("================小米系列產品=================");
        //小米工廠
        XiaomiFactory xiaomiFactory = new XiaomiFactory();

        //小米手機
        IPhoneProduct iphoneProduct = xiaomiFactory.iphoneProduct();

        iphoneProduct.start();
        iphoneProduct.callup();
        iphoneProduct.sendSMS();
        iphoneProduct.shutdown();

        //小米路由器
        IRouterProduct routerProduct = xiaomiFactory.routerProduct();

        routerProduct.start();
        routerProduct.openWifi();
        routerProduct.setting();
        routerProduct.shutdown();

        System.out.println("================華爲系列產品=================");
        //華爲工廠
        HuaweiFactory huaweiFactory = new HuaweiFactory();

        //華爲手機
        iphoneProduct = huaweiFactory.iphoneProduct();

        iphoneProduct.start();
        iphoneProduct.callup();
        iphoneProduct.sendSMS();
        iphoneProduct.shutdown();

        //華爲路由器
        routerProduct = huaweiFactory.routerProduct();

        routerProduct.start();
        routerProduct.openWifi();
        routerProduct.setting();
        routerProduct.shutdown();
    }
}

5.十、運行結果

================小米系列產品=================
開啓小米手機
小米打電話
小米發短信
關閉小米手機
開啓小米路由器
小米網絡
小米參數
關閉小米路由器
================華爲系列產品=================
開啓華爲手機
華爲手機打電話
華爲手機發短信
關閉華爲手機
開啓華爲路由器
華爲網絡
華爲參數
關閉華爲路由器

進程完成,退出碼 0

5.十一、實際的UML類圖

分析:

相關文章
相關標籤/搜索