自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一篇讀懂Java工廠設(shè)計(jì)模式

開(kāi)發(fā) 前端
我們的應(yīng)用程序是使用工廠方法模式設(shè)計(jì),現(xiàn)在就可以隨心所欲地增加新的機(jī)動(dòng)車(chē)輛。最后,我們看看使用UML表示法的最終設(shè)計(jì)是什么樣子的。

概述

本文將解釋Java中的工廠設(shè)計(jì)模式:工廠方法和抽象工廠,并用實(shí)際例子來(lái)說(shuō)明如何實(shí)現(xiàn)該模式。

工廠方法模式

比如為一家汽車(chē)制造商開(kāi)發(fā)一款應(yīng)用程序。起初,該客戶(hù)制造的車(chē)輛僅使用燃油發(fā)動(dòng)機(jī)。因此,為了遵循單一責(zé)任原則(SRP)和開(kāi)閉原則(OCP),我們使用工廠方法設(shè)計(jì)模式。

工廠方法模式通過(guò)將產(chǎn)品的構(gòu)造代碼與使用該產(chǎn)品的代碼分離來(lái)解耦合。

首先,在我們的示例應(yīng)用程序中,定義了MotorVehicle接口。這個(gè)接口只有一個(gè)方法build(),用于制造特定的機(jī)動(dòng)車(chē)輛:

public interface MotorVehicle {
    void build();
}

下一步是實(shí)現(xiàn)MotorVehicle接口的具體類(lèi)。我們創(chuàng)造了兩種類(lèi)型:摩托車(chē)和汽車(chē):

public class Motorcycle implements MotorVehicle {
    @Override
    public void build() {
        System.out.println("Build Motorcycle");
    }
}

public class Car implements MotorVehicle {
    @Override
    public void build() {
        System.out.println("Build Car");
    }
}

然后,我們創(chuàng)建MotorVehicleFactory類(lèi)。這個(gè)類(lèi)負(fù)責(zé)創(chuàng)建每個(gè)新的車(chē)輛實(shí)例。它是一個(gè)抽象類(lèi),因?yàn)樗鼮樘囟ǖ墓S制造特定的車(chē)輛:

public abstract class MotorVehicleFactory {
    public MotorVehicle create() {
        MotorVehicle vehicle = createMotorVehicle();
        vehicle.build();
        return vehicle;
    }
    protected abstract MotorVehicle createMotorVehicle();
}

方法create()調(diào)用抽象方法createMotorVehicle()來(lái)創(chuàng)建特定類(lèi)型的機(jī)動(dòng)車(chē)輛,之前我們具有兩種類(lèi)型的摩托車(chē)和汽車(chē):

public class MotorcycleFactory extends MotorVehicleFactory {
    @Override
    protected MotorVehicle createMotorVehicle() {
        return new Motorcycle();
    }
}

public class CarFactory extends MotorVehicleFactory {
    @Override
    protected MotorVehicle createMotorVehicle() {
        return new Car();
    }
}

我們的應(yīng)用程序是使用工廠方法模式設(shè)計(jì),現(xiàn)在就可以隨心所欲地增加新的機(jī)動(dòng)車(chē)輛。最后,我們看看使用UML表示法的最終設(shè)計(jì)是什么樣子的:

抽象工廠模式

比如兩家新的汽車(chē)品牌公司對(duì)我們上面設(shè)計(jì)的系統(tǒng)感興趣:NextGen和FutureVehicle。這些新公司不僅生產(chǎn)純?nèi)剂掀?chē),還生產(chǎn)電動(dòng)汽車(chē)。每家公司都有自己的汽車(chē)設(shè)計(jì),為了解決這些問(wèn)題,我們可以使用抽象工廠模式,將產(chǎn)品創(chuàng)建代碼集中在一個(gè)地方。UML表示為:

我們已經(jīng)有了MotorVehicle接口。此外,必須添加一個(gè)接口來(lái)表示電動(dòng)汽車(chē):

public interface ElectricVehicle {
    void build();
}

接下來(lái),我們創(chuàng)建抽象工廠。該類(lèi)是抽象的,因?yàn)閯?chuàng)建對(duì)象的責(zé)任將由具體工廠承擔(dān)。這種行為遵循OCP和SRP:

public abstract class Corporation {
    public abstract MotorVehicle createMotorVehicle();
    public abstract ElectricVehicle createElectricVehicle();
}

FutureVehicle公司生產(chǎn)的車(chē)輛:

public class FutureVehicleMotorcycle implements MotorVehicle {
    @Override
    public void build() {
        System.out.println("Future Vehicle Motorcycle");
    }
}

public class FutureVehicleElectricCar implements ElectricVehicle {
    @Override
    public void build() {
        System.out.println("Future Vehicle Electric Car");
    }
}

NexGen公司做了同樣的事情:

public class NextGenMotorcycle implements MotorVehicle {
    @Override
    public void build() {
        System.out.println("NextGen Motorcycle");
    }
}

public class NextGenElectricCar implements ElectricVehicle {
    @Override
    public void build() {
        System.out.println("NextGen Electric Car");
    }
}

FutureVehicle工廠:

public class FutureVehicleCorporation extends Corporation {
    @Override
    public MotorVehicle createMotorVehicle() {
        return new FutureVehicleMotorcycle();
    }
    @Override
    public ElectricVehicle createElectricVehicle() {
        return new FutureVehicleElectricCar();
    }
}

接下來(lái)是另一個(gè)NexGen工廠:

public class NextGenCorporation extends Corporation {
    @Override
    public MotorVehicle createMotorVehicle() {
        return new NextGenMotorcycle();
    }
    @Override
    public ElectricVehicle createElectricVehicle() {
        return new NextGenElectricCar();
    }
}

我們使用抽象工廠模式完成了實(shí)現(xiàn)。以下是我們自定義實(shí)現(xiàn)的UML圖:

結(jié)論

工廠方法使用繼承作為設(shè)計(jì)工具。而抽象工廠使用委托。

工廠方法依賴(lài)于派生類(lèi)來(lái)實(shí)現(xiàn),基類(lèi)提供預(yù)期的行為,它是在方法上,而不是在類(lèi)上。而抽象工廠被應(yīng)用于一個(gè)類(lèi)。

兩者都遵循OCP和SRP,產(chǎn)生了松散耦合的代碼,并為以后的更改擴(kuò)展提供了更大的靈活性。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2021-07-06 08:59:18

抽象工廠模式

2011-11-17 16:03:05

Java工廠模式Clojure

2017-09-04 13:44:00

Java

2022-07-07 12:01:43

ATTCALDERA框架

2017-06-08 22:41:34

框架標(biāo)簽

2023-11-20 10:11:05

集群節(jié)點(diǎn)Kubernetes

2023-06-26 00:26:40

I/OJava字節(jié)流

2019-09-24 14:19:12

PythonC語(yǔ)言文章

2020-09-17 11:19:39

Linux 系統(tǒng) 數(shù)據(jù)

2018-04-09 16:35:10

數(shù)據(jù)庫(kù)MySQLInnoDB

2020-04-22 13:27:20

數(shù)據(jù)分析模塊解決

2021-05-09 09:06:24

Python批處理命令

2021-05-11 08:54:59

建造者模式設(shè)計(jì)

2021-07-14 10:08:30

責(zé)任鏈模式加工鏈

2021-03-06 22:50:58

設(shè)計(jì)模式抽象

2020-08-21 07:23:50

工廠模式設(shè)計(jì)

2022-01-12 13:33:25

工廠模式設(shè)計(jì)

2021-07-28 10:02:54

建造者模式代碼

2019-04-09 11:07:15

HTTPS加密安全

2021-10-26 10:40:26

代理模式虛擬
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)