java設(shè)計(jì)模式 - 工廠模式
目錄
一、簡介
二、簡單工廠模式
三、工廠方法模式
四、抽象工廠模式
五、總結(jié)
一、簡介
工廠模式主要是為創(chuàng)建對(duì)象提供過渡接口,以便將創(chuàng)建對(duì)象的具體過程屏蔽隔離起來,達(dá)到提高靈活性的目的。
工廠模式有三種:簡單工廠模式、工廠方法模式、抽象工廠模式。
二、簡單工廠模式
簡單工廠模式由三類角色組成:抽象產(chǎn)品、具體產(chǎn)品、工廠類。
??抽象產(chǎn)品(寶馬):?
public abstract class BMW {
/**
* 寶馬介紹
*/
abstract void introduce();
}
??具體產(chǎn)品(寶馬三系、寶馬五系):
public class BMW320 extends BMW {
@Override
void introduce() {
System.out.println("寶馬三系");
}
}
public class BMW525 extends BMW {
@Override
void introduce() {
System.out.println("寶馬五系");
}
}
??工廠類(寶馬三五系生產(chǎn)車間):
public class BMWFactory {
/**
* 寶馬生產(chǎn)
*
* @param type 寶馬型號(hào)
* @return 寶馬
*/
public static BMW makeBMW(int type) {
switch (type) {
case 320:
return new BMW320();
case 525:
return new BMW525();
default:
break;
}
return null;
}
}
??調(diào)用:
public class Customer {
public static void main(String[] args) {
// 生產(chǎn)寶馬三系
BMW bmw320 = BMWFactory.makeBMW(320);
// 生產(chǎn)寶馬五系
BMW bmw525 = BMWFactory.makeBMW(525);
}
}
優(yōu)點(diǎn):
1、將產(chǎn)品交由工廠創(chuàng)建,使用方無需關(guān)心產(chǎn)品創(chuàng)建細(xì)節(jié),實(shí)現(xiàn)了創(chuàng)建與使用的解耦。
缺點(diǎn):
1、違背 “開閉原則”(對(duì)擴(kuò)展開放,對(duì)修改封閉),新增產(chǎn)品(寶馬七系)不得不修改工廠類邏輯。
三、工廠方法模式
工廠方法模式由四類角色組成:抽象產(chǎn)品、具體產(chǎn)品、抽象工廠、具體工廠。?
??抽象產(chǎn)品(寶馬):
public abstract class BMW {
/**
* 寶馬介紹
*/
abstract void introduce();
}
??具體產(chǎn)品(寶馬三系、寶馬五系):?
public class BMW320 extends BMW {
@Override
void introduce() {
System.out.println("寶馬三系");
}
}
public class BMW525 extends BMW {
@Override
void introduce() {
System.out.println("寶馬五系");
}
}
? ?抽象工廠(寶馬生產(chǎn)車間):
public abstract class Factory {
/**
* 寶馬生產(chǎn)
*
* @return 寶馬
*/
abstract BMW makeBMW();
}
??具體工廠(寶馬三系生產(chǎn)車間、寶馬五系生產(chǎn)車間):?
public class BMW320Factory extends Factory {
@Override
BMW makeBMW() {
return new BMW320();
}
}
public class BMW525Factory extends Factory {
@Override
BMW makeBMW() {
return new BMW525();
}
}
??調(diào)用:?
public class Customer {
public static void main(String[] args) {
// 生產(chǎn)寶馬三系
Factory bMW320Factory = new BMW320Factory();
BMW bmw320 = bMW320Factory.makeBMW();
// 生產(chǎn)寶馬五系
Factory bMW525Factory = new BMW525Factory();
BMW bmw525 = bMW525Factory.makeBMW();
}
}
優(yōu)點(diǎn):
1、符合 “開閉原則”(對(duì)擴(kuò)展開放,對(duì)修改封閉),新增產(chǎn)品(寶馬七系)只需新增具體產(chǎn)品類和具體工廠類即可。
2、符合 “單一職責(zé)原則”,每個(gè)具體工廠類只負(fù)責(zé)創(chuàng)建對(duì)應(yīng)的產(chǎn)品。
缺點(diǎn):
1、系統(tǒng)復(fù)雜度增加:新增產(chǎn)品(寶馬七系),類的個(gè)數(shù)成對(duì)增加(寶馬七系?+ 寶馬七系生產(chǎn)車間)。
2、系統(tǒng)抽象性和理解難度增加。
3、具體工廠只能創(chuàng)建一類產(chǎn)品(寶馬類)。
四、抽象工廠模式
抽象工廠模式由五類角色組成:抽象產(chǎn)品族、抽象產(chǎn)品、具體產(chǎn)品、抽象工廠、具體工廠。
? 抽象產(chǎn)品族(汽車):?
public abstract class Car {
/**
* 汽車介紹
*/
abstract void introduce();
}
??抽象產(chǎn)品(寶馬、奔馳):
public abstract class BMW extends Car {
/**
* 寶馬介紹
*/
@Override
abstract void introduce();
}
public abstract class Benz extends Car {
/**
* 奔馳介紹
*/
@Override
abstract void introduce();
}
? 具體產(chǎn)品(寶馬三系、寶馬五系、奔馳C級(jí)、奔馳E級(jí)):
public class BMW320 extends BMW {
@Override
void introduce() {
System.out.println("寶馬三系");
}
}
public class BMW525 extends BMW {
@Override
void introduce() {
System.out.println("寶馬五系");
}
}
public class BenzC extends Benz {
@Override
void introduce() {
System.out.println("奔馳C級(jí)");
}
}
public class BenzE extends Benz {
@Override
void introduce() {
System.out.println("奔馳E級(jí)");
}
}
? ?抽象工廠(汽車生產(chǎn)車間):
public abstract class Factory {
/**
* 寶馬生產(chǎn)
*
* @return 汽車
*/
abstract Car makeBMW();
/**
* 奔馳生產(chǎn)
*
* @return 汽車
*/
abstract Car makeBenz();
}
??具體工廠(寶馬三系+奔馳C級(jí)生產(chǎn)車間、寶馬五系+奔馳E級(jí)生產(chǎn)車間):
public class BMW320BenzCFactory extends Factory {
@Override
Car makeBMW() {
return new BMW320();
}
@Override
Car makeBenz() {
return new BenzC();
}
}
public class BMW525BenzEFactory extends Factory {
@Override
Car makeBMW() {
return new BMW525();
}
@Override
Car makeBenz() {
return new BenzE();
}
}
??調(diào)用:?
public class Customer {
public static void main(String[] args) {
// 生產(chǎn)寶馬三系+奔馳C級(jí)
Factory bMW320BenzCFactory = new BMW320BenzCFactory();
Car bmw320 = bMW320BenzCFactory.makeBMW();
Car benzC = bMW320BenzCFactory.makeBenz();
// 生產(chǎn)寶馬五系+奔馳E級(jí)
Factory bMW525BenzEFactory = new BMW525BenzEFactory();
Car bmw525 = bMW525BenzEFactory.makeBMW();
Car benzE = bMW525BenzEFactory.makeBenz();
}
}
優(yōu)點(diǎn):
1、符合 “開閉原則”(對(duì)擴(kuò)展開放,對(duì)修改封閉)。
2、符合 “單一職責(zé)原則”。
缺點(diǎn):?
1、難以擴(kuò)展新種類(奧迪)。
五、總結(jié)
抽象程度:
簡單工廠模式 < 工廠方法模式 < 抽象工廠模式。
角色分類:
1、簡單工廠模式:抽象產(chǎn)品、具體產(chǎn)品、工廠類。
2、工廠方法模式:抽象產(chǎn)品、具體產(chǎn)品、抽象工廠、具體工廠。
3、抽象工廠模式:抽象產(chǎn)品族、抽象產(chǎn)品、具體產(chǎn)品、抽象工廠、具體工廠。