設(shè)計模式(三)——簡單工廠和抽象工廠

前言

前排提示:這是一個學(xué)習(xí)筆記,參照馬士兵老師和韓順平老師設(shè)計模式的視頻學(xué)習(xí)的筆記。記錄下來純?yōu)殪柟毯头奖闳蘸蟮膹?fù)習(xí)!
參考:
韓順平老師:https://www.bilibili.com/video/BV1G4411c7N4?from=search&seid=15531256878937056259
馬士兵老師:https://www.bilibili.com/video/BV1tK411W7xx?from=search&seid=15531256878937056259

設(shè)計模式(序)——設(shè)計模式初識和原則
設(shè)計模式(一)——單例模式
設(shè)計模式(二)——策略模式
設(shè)計模式(三)——簡單工廠和抽象工廠

六、工廠模式

任何可以產(chǎn)生對象的方法或者類都可以被稱之為工廠,單例模式也是一種工廠。

由實例引出工廠模式

問題1:假設(shè)現(xiàn)在有一個工廠,能生產(chǎn)寶馬、奔馳、奧迪等三個品牌汽車的零件,該如何設(shè)計?
思路:首先我們可以通過面向?qū)ο笾卸鄳B(tài)的理念來實現(xiàn)這一問題。編寫一個接口里面有一個生產(chǎn)零件的方法。編寫奔馳、寶馬和奧迪三個類來實現(xiàn)這一接口。然后在主方法中藥什么汽車的零件就new什么汽車的零件即可。

實現(xiàn)步驟:

第一步:創(chuàng)建接口

public interface ProductionParts {
    void create();
}

第二步:創(chuàng)建三個類,來實現(xiàn)接口,為了簡潔這里只展出其中的一個類

public class Mercedes implements ProductionParts {

    @Override
    public void create() {
        System.out.println("Mercedes開始制造......");
    }
}

在主類中測試

public class Main {
    public static void main(String[] args) {
        ProductionParts parts = new Mercedes();
//        ProductionParts parts = new Audi();
//        ProductionParts parts = new BMW();
        parts.create();
    }
}

問題2:假設(shè)我們要讓第一第二號流水線生產(chǎn)奔馳的零件,第三第五號流水線生產(chǎn)寶馬的零件等,并且隔一段時間流水線生產(chǎn)的汽車品牌零件可能會變。該如何設(shè)計?
思路:這時我們可以定義一個父類,在父類中可以創(chuàng)建三個品牌,在創(chuàng)建品牌之前我們可以為其定制流水線

實現(xiàn)步驟:

第一步:創(chuàng)建父類

public class VehicleFactory {
    public Mercedes createMercedes(){
        //定制流水線等操作
        System.out.println("三、四號流水線。。");
        return new Mercedes();
    }
    public BMW createBMW(){
        System.out.println("一、五號流水線。。");
        return new BMW();
    }
    public Audi createAudi(){
        //.....
        return new Audi();
    }
}

在主類中測試

public class Main {
    public static void main(String[] args) {
        BMW bmw = new VehicleFactory().createBMW();
        bmw.create();
    }
}

總結(jié)

以上兩個問題的綜合解決方案就是工廠模式。
工廠模式的優(yōu)點:

  • 簡單易實現(xiàn)
  • 當(dāng)我們需要什么對象時,只需要知道對象名就可以從工廠中獲取
    工廠模式的缺點:
  • 拓展性差,每多一個品牌,就要添加一個類

七、抽象工廠

由實例引出抽象工廠

思考:由前面的簡單工廠模式引發(fā)進一步思考,假設(shè)這家工廠拓展業(yè)務(wù)了,不僅可以生產(chǎn)汽車的零件(如車門和車輪),還能生產(chǎn)公交車零件(車門和車輪)時,該如何設(shè)計
先構(gòu)建生產(chǎn)車輪的工廠和生產(chǎn)車門的工廠————抽象產(chǎn)品

public abstract class TireFactory {
    abstract void createtire();
}
public abstract class DoorFactory {
    abstract void createdoor();
}

編寫生產(chǎn)公交車車門和車輪的實際方法和編寫汽車車門和車輪的實際方法————具體產(chǎn)品

public class BusDoor extends DoorFactory{
    @Override
    public void createdoor(){
        System.out.println("生產(chǎn)公交車車門");
    }
}
public class BusTire extends TireFactory{
    @Override
    public void createtire(){
        System.out.println("生產(chǎn)公交車輪胎");
    }
}
public class CarDoor extends DoorFactory{
    @Override
    public void createdoor() {
        System.out.println("生產(chǎn)汽車車門");
    }
}
public class CarTire extends TireFactory {
    @Override
    public void createtire(){
        System.out.println("生產(chǎn)汽車輪胎");
    }
}

構(gòu)建一個抽象工廠可以用來生產(chǎn)車門和車輪————抽象工廠

public abstract class AbstractFactory {
    abstract DoorFactory CreateDoor();
    abstract TireFactory CreateTire();
}

編寫具體的公交車工廠和汽車工廠————具體工廠

public class BusFactory extends AbstractFactory {

    @Override
    DoorFactory CreateDoor() {
        return new BusDoor();
    }

    @Override
    TireFactory CreateTire() {
        return new BusTire();
    }
}
public class CarFactory extends AbstractFactory {

    @Override
    DoorFactory CreateDoor() {
        return new CarDoor();
    }

    @Override
    TireFactory CreateTire() {
        return new CarTire();
    }
}

主類測試

public class Main {
    public static void main(String[] args) {
        AbstractFactory busfactory = new BusFactory();
        DoorFactory busdoor = busfactory.CreateDoor();
        busdoor.createdoor();
        TireFactory bustire = busfactory.CreateTire();
        bustire.createtire();

        AbstractFactory carfactory = new CarFactory();
        DoorFactory cardoor = carfactory.CreateDoor();
        cardoor.createdoor();
        TireFactory cartire = carfactory.CreateTire();
        cartire.createtire();
    }
}

總結(jié)

抽象模式是對簡單工廠的進一步改造,抽象工廠基本上由四個模塊組成:抽象產(chǎn)品、抽象工廠、具體產(chǎn)品和具體工廠。
優(yōu)點:

  • 擴展性比簡單工廠強
  • 能夠?qū)⒁幌盗械漠a(chǎn)品統(tǒng)一創(chuàng)建

缺點:

  • 規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合,產(chǎn)品簇中擴展新的產(chǎn)品困難
  • 增加了系統(tǒng)的抽象性和理解難度
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容