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

成都一家集口碑和實(shí)力的網(wǎng)站建設(shè)服務(wù)商,擁有專業(yè)的企業(yè)建站團(tuán)隊(duì)和靠譜的建站技術(shù),十多年企業(yè)及個(gè)人網(wǎng)站建設(shè)經(jīng)驗(yàn) ,為成都上千余家客戶提供網(wǎng)頁設(shè)計(jì)制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營銷型網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),同時(shí)也為不同行業(yè)的客戶提供成都網(wǎng)站建設(shè)、做網(wǎng)站的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機(jī)械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選創(chuàng)新互聯(lián)公司。
工廠方法模式
比如為一家汽車制造商開發(fā)一款應(yīng)用程序。起初,該客戶制造的車輛僅使用燃油發(fā)動(dòng)機(jī)。因此,為了遵循單一責(zé)任原則(SRP)和開閉原則(OCP),我們使用工廠方法設(shè)計(jì)模式。
工廠方法模式通過將產(chǎn)品的構(gòu)造代碼與使用該產(chǎn)品的代碼分離來解耦合。
首先,在我們的示例應(yīng)用程序中,定義了MotorVehicle接口。這個(gè)接口只有一個(gè)方法build(),用于制造特定的機(jī)動(dòng)車輛:
public interface MotorVehicle {
void build();
}下一步是實(shí)現(xiàn)MotorVehicle接口的具體類。我們創(chuàng)造了兩種類型:摩托車和汽車:
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類。這個(gè)類負(fù)責(zé)創(chuàng)建每個(gè)新的車輛實(shí)例。它是一個(gè)抽象類,因?yàn)樗鼮樘囟ǖ墓S制造特定的車輛:
public abstract class MotorVehicleFactory {
public MotorVehicle create() {
MotorVehicle vehicle = createMotorVehicle();
vehicle.build();
return vehicle;
}
protected abstract MotorVehicle createMotorVehicle();
}方法create()調(diào)用抽象方法createMotorVehicle()來創(chuàng)建特定類型的機(jī)動(dòng)車輛,之前我們具有兩種類型的摩托車和汽車:
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)車輛。最后,我們看看使用UML表示法的最終設(shè)計(jì)是什么樣子的:
抽象工廠模式
比如兩家新的汽車品牌公司對(duì)我們上面設(shè)計(jì)的系統(tǒng)感興趣:NextGen和FutureVehicle。這些新公司不僅生產(chǎn)純?nèi)剂掀?,還生產(chǎn)電動(dòng)汽車。每家公司都有自己的汽車設(shè)計(jì),為了解決這些問題,我們可以使用抽象工廠模式,將產(chǎn)品創(chuàng)建代碼集中在一個(gè)地方。UML表示為:
我們已經(jīng)有了MotorVehicle接口。此外,必須添加一個(gè)接口來表示電動(dòng)汽車:
public interface ElectricVehicle {
void build();
}接下來,我們創(chuàng)建抽象工廠。該類是抽象的,因?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)的車輛:
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();
}
}接下來是另一個(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ì)工具。而抽象工廠使用委托。
工廠方法依賴于派生類來實(shí)現(xiàn),基類提供預(yù)期的行為,它是在方法上,而不是在類上。而抽象工廠被應(yīng)用于一個(gè)類。
兩者都遵循OCP和SRP,產(chǎn)生了松散耦合的代碼,并為以后的更改擴(kuò)展提供了更大的靈活性。
本文名稱:一篇讀懂Java工廠設(shè)計(jì)模式
本文URL:http://www.dlmjj.cn/article/dhsjcpc.html


咨詢
建站咨詢
