工廠模式在程序設(shè)計(jì)中是經(jīng)常用到的一個(gè)設(shè)計(jì)模式,它可以將系統(tǒng)的構(gòu)建過程和使用過程解耦。
工廠模式分為三種:
(1)簡(jiǎn)單工廠模式
(2)工廠方法模式
(3)抽象工廠模式
(1)簡(jiǎn)單工廠模式

場(chǎng)景:制作戴爾鼠標(biāo)和惠普鼠標(biāo)
分析:
(1)戴爾鼠標(biāo)和惠普鼠標(biāo)都是鼠標(biāo),其中都有“制作”這個(gè)行為;
(2)為了方便生產(chǎn),來一個(gè)工廠統(tǒng)一制造這兩種品牌鼠標(biāo);
定義一個(gè)鼠標(biāo)接口,聲明兩種鼠標(biāo)共同的行為doOption
public interface Mouse {
public void doOption();
}
創(chuàng)建戴爾鼠標(biāo)對(duì)象,并實(shí)現(xiàn)“制造”行為
public class DellMouse implements Mouse {
@Override
public void doOption() {
System.out.println("制作戴爾鼠標(biāo)");
}
}
創(chuàng)建惠普鼠標(biāo)對(duì)象,并實(shí)現(xiàn)“制造”行為
public class HpMouse implements Mouse{
@Override
public void doOption() {
System.out.println("制作惠普鼠標(biāo)");
}
}
創(chuàng)建一個(gè)工廠,統(tǒng)一管理這兩種鼠標(biāo)
public class MouseFactory {
private static Mouse mouse;
/**
* 簡(jiǎn)單工廠模式
* @param flag 0:戴爾鼠標(biāo) 1:惠普鼠標(biāo)
* @return
*/
public static Mouse createMouse(int flag){
switch (flag){
case 0:
mouse = new DellMouse();
break;
case 1:
mouse = new HpMouse();
break;
}
return mouse;
}
}
使用
Mouse mouse1 = MouseFactory.createMouse(0);
mouse1.doOption();
Mouse mouse2 = MouseFactory.createMouse(1);
mouse2.doOption();
以上就是簡(jiǎn)單工廠模式了。
缺點(diǎn):生產(chǎn)哪種鼠標(biāo)由參數(shù)決定, 在使用的時(shí)候,參數(shù)的意義不明確,使用困難。
個(gè)人理解:雖然簡(jiǎn)單工廠模式有缺陷,但是如果需要區(qū)分的參數(shù)不是太多,并且添加注釋說面每個(gè)參數(shù)的意思也是可以這樣寫的。
(2)工廠方法模式

場(chǎng)景:和(1)類似, 也是生產(chǎn)兩種不同品牌的鼠標(biāo)。
分析:為了解決(1)中“參數(shù)的意義不明確”的弊端,可以將工廠分離,即工廠A專門生產(chǎn)戴爾鼠標(biāo),工廠B專門生產(chǎn)惠普鼠標(biāo)。
定義一個(gè)鼠標(biāo)接口,聲明兩種鼠標(biāo)共同的行為doOption
public interface Mouse {
public void doOption();
}
創(chuàng)建戴爾鼠標(biāo)對(duì)象,并實(shí)現(xiàn)“制造”行為
public class DellMouse implements Mouse {
@Override
public void doOption() {
System.out.println("制作戴爾鼠標(biāo)");
}
}
創(chuàng)建惠普鼠標(biāo)對(duì)象,并實(shí)現(xiàn)“制造”行為
public class HpMouse implements Mouse{
@Override
public void doOption() {
System.out.println("制作惠普鼠標(biāo)");
}
}
定義一個(gè)專門生產(chǎn)戴爾鼠標(biāo)的工廠
public class DellMouseFactory implements MouseFactory {
@Override
public Mouse createMouse() {
return new DellMouse();
}
}
定義一個(gè)專門生產(chǎn)惠普鼠標(biāo)的工廠
public class HpMouseFactroy implements MouseFactory {
@Override
public Mouse createMouse() {
return new HpMouse();
}
}
使用
//工廠模式(生產(chǎn)哪種鼠標(biāo)由對(duì)象決定)
Mouse mouse1 = new DellMouseFactory().createMouse();
mouse1.doOption();
Mouse mouse2 = new HpMouseFactroy().createMouse();
mouse2.doOption();
優(yōu)點(diǎn):
(1)避免了簡(jiǎn)單工廠模式參數(shù)不清晰的問題;
(2)生產(chǎn)哪種品牌的鼠標(biāo)由工廠對(duì)象決定;
(3)抽象工廠模式

說明:
(1)當(dāng)抽象工廠模式的產(chǎn)品只有一個(gè)的時(shí)候,即變成工廠模式;
(2)當(dāng)工廠模式的產(chǎn)品變成多個(gè)時(shí),即變成抽象工廠模式;
場(chǎng)景:有兩個(gè)工廠,分別是戴爾工廠和惠普工廠,戴爾工廠生產(chǎn)對(duì)應(yīng)品牌的鼠標(biāo)和鍵盤,惠普工廠也生產(chǎn)對(duì)應(yīng)品牌的鼠標(biāo)和鍵盤;
定義一個(gè)鼠標(biāo)接口,聲明兩種鼠標(biāo)共同的行為doOption
public interface Mouse {
public void doOption();
}
創(chuàng)建戴爾鼠標(biāo)對(duì)象,并實(shí)現(xiàn)“制造”行為
public class DellMouse implements Mouse {
@Override
public void doOption() {
System.out.println("制作戴爾鼠標(biāo)");
}
}
創(chuàng)建惠普鼠標(biāo)對(duì)象,并實(shí)現(xiàn)“制造”行為
public class HpMouse implements Mouse{
@Override
public void doOption() {
System.out.println("制作惠普鼠標(biāo)");
}
}
定義一個(gè)鍵盤接口,聲明兩種鼠標(biāo)共同的行為sayHi
public interface KeyBoard {
void sayHi();
}
創(chuàng)建戴爾鍵盤對(duì)象,并實(shí)現(xiàn)其行為
public class DellKeyBoard implements KeyBoard{
@Override
public void sayHi() {
System.out.println("我是戴爾鍵盤");
}
}
創(chuàng)建惠普鍵盤對(duì)象,并實(shí)現(xiàn)其行為
public class HpKeyBoard implements KeyBoard {
@Override
public void sayHi() {
System.out.println("我是惠普鍵盤");
}
}
定義一個(gè)戴爾工廠,用來生產(chǎn)對(duì)應(yīng)品牌的鼠標(biāo)和鍵盤
public class DellFactory implements PcFactory {
@Override
public Mouse createMouse() {
return new DellMouse();
}
@Override
public KeyBoard createKeyBoard() {
return new DellKeyBoard();
}
}
定義一個(gè)惠普工廠,用來生產(chǎn)對(duì)應(yīng)品牌的鼠標(biāo)和鍵盤
public class HpFactory implements PcFactory {
@Override
public Mouse createMouse() {
return new HpMouse();
}
@Override
public KeyBoard createKeyBoard() {
return new HpKeyBoard();
}
}
使用
Mouse mouse5 = new DellFactory().createMouse();
mouse5.doOption();
KeyBoard keyBoard1 = new DellFactory().createKeyBoard();
keyBoard1.sayHi();
Mouse mouse6 = new HpFactory().createMouse();
mouse6.doOption();
KeyBoard keyBoard2 = new HpFactory().createKeyBoard();
keyBoard2.sayHi();
總結(jié):
(1)簡(jiǎn)單工廠模式,還是真的簡(jiǎn)單,用一個(gè)雜牌工廠類生產(chǎn)多個(gè)雜牌產(chǎn)品,在使用該模式的時(shí)候,需要傳遞一個(gè)參數(shù),這個(gè)參數(shù)用來區(qū)分不同的產(chǎn)品;
(2)工廠模式(工廠方法模式),用多個(gè)工廠分別生產(chǎn)不同品牌的單個(gè)產(chǎn)品;
(3)抽象工廠模式,用多個(gè)工廠分別生產(chǎn)不同品牌的多個(gè)產(chǎn)品;
[本章完...]