一、工廠模式簡介
1. 定義
工廠模式(Factory Pattern)是Java中常用的設(shè)計模式之一,這種設(shè)計模式屬于創(chuàng)建型模式。工廠模式的主要意圖是為創(chuàng)建對象提供過渡接口,以便將創(chuàng)建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。
2. 分類
工廠模式可以分為三類:
- 簡單工廠模式(Simple Factory)
- 工廠方法模式(Factory Method)
- 抽象工廠模式(Abstract Factory)
二、簡單工廠模式
1. 定義
簡單工廠模式又稱靜態(tài)工廠方法模式,其工廠類定義了一個靜態(tài)方法。在簡單工廠模式中,工廠類處于對產(chǎn)品類實例化調(diào)用的中心位置上,它決定那一個產(chǎn)品類應(yīng)當(dāng)被實例化。簡而言之,就是有一個專門生產(chǎn)某個產(chǎn)品的類。
2. 模式組成
- 抽象產(chǎn)品
- 具體產(chǎn)品
- 工廠類
3. 具體實現(xiàn)
鼠標(biāo)工廠,專業(yè)生產(chǎn)鼠標(biāo),給參數(shù)"Dell",生產(chǎn)戴爾鼠標(biāo),給參數(shù)Hp",生產(chǎn)惠普鼠標(biāo)。
/**
* 抽象產(chǎn)品-鼠標(biāo)
*/
public abstract class Mouse {
public abstract void sayHi();
}
/**
* 具體產(chǎn)品-戴爾鼠標(biāo)
*/
public class DellMouse extends Mouse {
@Override
public void sayHi() {
System.out.println("**** SimpleFactoryPattern **** I am a Dell Mouse.");
}
}
/**
* 具體產(chǎn)品-惠普鼠標(biāo)
*/
public class HpMouse extends Mouse {
@Override
public void sayHi() {
System.out.println("**** SimpleFactoryPattern **** I am a Hp Mouse.");
}
}
/**
* 工廠類
*/
public class MouseFactory {
public static Mouse ManufactureMouse(String mouseType) {
if ("Dell".equals(mouseType)) {
return new DellMouse();
} else if ("Hp".equals(mouseType)) {
return new HpMouse();
}
return null;
}
}
外界通過調(diào)用工廠類的靜態(tài)方法,傳入不同參數(shù)從而創(chuàng)建不同具體產(chǎn)品類的實例:
private void testSimpleFactoryPattern() {
Mouse dellMouse = MouseFactory.ManufactureMouse("Dell");
if (dellMouse != null) {
dellMouse.sayHi();
}
Mouse hpMouse = MouseFactory.ManufactureMouse("Hp");
if (hpMouse != null) {
hpMouse.sayHi();
}
}
輸出結(jié)果:
**** SimpleFactoryPattern **** I am a Dell Mouse.
**** SimpleFactoryPattern **** I am a Hp Mouse.
三、工廠方法模式
1. 定義
工廠方法模式去掉了簡單工廠模式中工廠類中的靜態(tài)屬性,使得它可以被子類繼承,而子類則負責(zé)生成具體的對象。這樣就可以將類的實例化延遲到工廠類的子類中完成,即由子類來決定應(yīng)該實例化哪一個類。
2. 模式組成
- 抽象產(chǎn)品
- 具體產(chǎn)品
- 抽象工廠
- 具體工廠
3. 具體實現(xiàn)
生產(chǎn)鼠標(biāo)工廠是個父類,有生產(chǎn)鼠標(biāo)這個接口。生產(chǎn)戴爾鼠標(biāo)工廠,生產(chǎn)惠普鼠標(biāo)工廠分別繼承這個工廠父類,可以分別生產(chǎn)戴爾鼠標(biāo),惠普鼠標(biāo)。生產(chǎn)哪種鼠標(biāo)不再由參數(shù)決定,而是由創(chuàng)建的具體鼠標(biāo)工廠決定,后續(xù)直接調(diào)用鼠標(biāo)工廠.生產(chǎn)鼠標(biāo)()即可。
/**
* 抽象產(chǎn)品-鼠標(biāo)
*/
public abstract class Mouse {
public abstract void sayHi();
}
/**
* 具體產(chǎn)品-戴爾鼠標(biāo)
*/
public class DellMouse extends Mouse {
@Override
public void sayHi() {
System.out.println("**** FactoryPattern **** I am a Dell Mouse.");
}
}
/**
* 具體產(chǎn)品-惠普鼠標(biāo)
*/
public class HpMouse extends Mouse {
@Override
public void sayHi() {
System.out.println("**** FactoryPattern **** I am a Hp Mouse.");
}
}
/**
* 抽象工廠-生產(chǎn)鼠標(biāo)
*/
public abstract class MouseFactory {
public abstract Mouse ManufactureMouse();
}
/**
* 具體工廠-生產(chǎn)戴爾鼠標(biāo)
*/
public class DellMouseFactory extends MouseFactory {
@Override
public Mouse ManufactureMouse() {
return new DellMouse();
}
}
/**
* 具體工廠-生產(chǎn)惠普鼠標(biāo)
*/
public class HpMouseFactory extends MouseFactory {
@Override
public Mouse ManufactureMouse() {
return new HpMouse();
}
}
創(chuàng)建不同的鼠標(biāo)工廠,生產(chǎn)不同的鼠標(biāo):
private void testFactoryPattern() {
MouseFactory dellMouseFactory = new DellMouseFactory();
dellMouseFactory.ManufactureMouse().sayHi();
MouseFactory hpMouseFactory = new HpMouseFactory();
hpMouseFactory.ManufactureMouse().sayHi();
}
輸出結(jié)果:
**** FactoryPattern **** I am a Dell Mouse.
**** FactoryPattern **** I am a Hp Mouse.
四、抽象工廠模式
1. 定義
抽象工廠模式是工廠方法模式的升級版本,用來創(chuàng)建一組相關(guān)或者相互依賴的對象。它允許使用抽象的接口來創(chuàng)建一組相關(guān)產(chǎn)品,而不需要知道或關(guān)心實際生產(chǎn)出的具體產(chǎn)品是什么,具體的工廠負責(zé)會實現(xiàn)具體的產(chǎn)品實例。其與工廠方法模式最大的區(qū)別就是抽象工廠中每個工廠可以創(chuàng)建多種類的產(chǎn)品,而工廠方法每個工廠只能創(chuàng)建一類產(chǎn)品。
2. 模式組成
- 抽象產(chǎn)品(多個)
- 具體產(chǎn)品
- 抽象工廠
- 具體工廠
3. 具體實現(xiàn)
抽象工廠模式也就是不僅生產(chǎn)鼠標(biāo),而且同時生產(chǎn)鍵盤。PC廠商是個父類,有生產(chǎn)鼠標(biāo),生產(chǎn)鍵盤兩個接口。戴爾工廠,惠普工廠分別繼承這個父類,可以分別生產(chǎn)戴爾鼠標(biāo)和戴爾鍵盤,以及惠普鼠標(biāo)和惠普鍵盤。生產(chǎn)的鼠標(biāo)以及鍵盤由創(chuàng)建的工廠決定,后續(xù)工廠.生產(chǎn)鼠標(biāo)()則生產(chǎn)具體的鼠標(biāo),工廠.生產(chǎn)鍵盤()則生產(chǎn)具體的鍵盤。
/**
* 抽象產(chǎn)品-鼠標(biāo)
*/
public abstract class Mouse {
public abstract void sayHi();
}
/**
* 抽象產(chǎn)品-鍵盤
*/
public abstract class Keyboard {
public abstract void sayHi();
}
/**
* 具體產(chǎn)品-戴爾鼠標(biāo)
*/
public class DellMouse extends Mouse {
@Override
public void sayHi() {
System.out.println("**** AbstractFactoryPattern **** I am a Dell Mouse.");
}
}
/**
* 具體產(chǎn)品-惠普鼠標(biāo)
*/
public class HpMouse extends Mouse {
@Override
public void sayHi() {
System.out.println("**** AbstractFactoryPattern **** I am a Hp Mouse.");
}
}
/**
* 具體產(chǎn)品-戴爾鍵盤
*/
public class DellKeyboard extends Keyboard {
@Override
public void sayHi() {
System.out.println("**** AbstractFactoryPattern **** I am a Dell Keyboard.");
}
}
/**
* 具體產(chǎn)品-惠普鍵盤
*/
public class HpKeyboard extends Keyboard {
@Override
public void sayHi() {
System.out.println("**** AbstractFactoryPattern **** I am a Hp Keyboard.");
}
}
/**
* 抽象工廠-生產(chǎn)鼠標(biāo)和鍵盤
*/
public abstract class PcFactory {
public abstract Mouse ManufactureMouse();
public abstract Keyboard ManufactureKeyboard();
}
/**
* 具體工廠-生產(chǎn)戴爾鼠標(biāo)和戴爾鍵盤
*/
public class DellFactory extends PcFactory {
@Override
public Mouse ManufactureMouse() {
return new DellMouse();
}
@Override
public Keyboard ManufactureKeyboard() {
return new DellKeyboard();
}
}
/**
* 具體工廠-生產(chǎn)惠普鼠標(biāo)和惠普鍵盤
*/
public class HpFactory extends PcFactory {
@Override
public Mouse ManufactureMouse() {
return new HpMouse();
}
@Override
public Keyboard ManufactureKeyboard() {
return new HpKeyboard();
}
}
創(chuàng)建不同的工廠,生產(chǎn)不同的鼠標(biāo)和鍵盤:
private void testAbstractFactoryPattern() {
PcFactory dellFactory = new DellFactory();
dellFactory.ManufactureMouse().sayHi();
dellFactory.ManufactureKeyboard().sayHi();
PcFactory hpFactory = new HpFactory();
hpFactory.ManufactureMouse().sayHi();
hpFactory.ManufactureKeyboard().sayHi();
}
輸出結(jié)果:
**** AbstractFactoryPattern **** I am a Dell Mouse.
**** AbstractFactoryPattern **** I am a Dell Keyboard.
**** AbstractFactoryPattern **** I am a Hp Mouse.
**** AbstractFactoryPattern **** I am a Hp Keyboard.