從一個(gè)栗子開(kāi)始,現(xiàn)在兩種產(chǎn)品一個(gè)是普通輪胎,一個(gè)是越野輪胎,然后生產(chǎn)這兩種產(chǎn)品,用工廠模式去實(shí)現(xiàn)是
public interface ITire {
void tire();
}
public class NormalTire implements ITire{
@Override
public void tire() {
System.out.println("普通輪胎");
}
}
public class SUVTire implements ITire{
@Override
public void tire() {
System.out.println("越野輪胎");
}
}
public class FactoryTire {
public static <T extends ITire> T createTire(Class<T> clz){
ITire tire = null;
try {
tire = (ITire) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) tire;
}
}
但是現(xiàn)在需求變了,我不生產(chǎn)輪胎要生產(chǎn)汽車了,那么汽車包含的零件就多了,絕不僅僅限于輪胎,而且汽車的款式也多,這么一個(gè)復(fù)雜的生產(chǎn)關(guān)系,我們就要用到抽象工廠設(shè)計(jì)模式了. 在這個(gè)時(shí)候抽象的工廠是汽車生產(chǎn)工廠,注意它不像簡(jiǎn)單工廠模式那樣,僅僅局限于一種特定的產(chǎn)品去生產(chǎn),所以我們這里還需要對(duì)工廠抽象。
先來(lái)看一張抽象工廠的uml.

image.png
目前需求是生產(chǎn)Q7和Q3汽車,那么需要引擎和輪胎兩種零件,uml可以看成是

image.png
實(shí)際代碼
public interface ITire {
void tire();
}
public class NormalTire implements ITire{
@Override
public void tire() {
System.out.println("普通輪胎");
}
}
public class SUVTire implements ITire{
@Override
public void tire() {
System.out.println("越野輪胎");
}
}
public interface IEngine {
void engine();
}
public class ImportEngine implements IEngine{
@Override
public void engine() {
System.out.println("進(jìn)口發(fā)動(dòng)機(jī)");
}
}
public class DemesticEngine implements IEngine{
@Override
public void engine() {
System.out.println("國(guó)產(chǎn)發(fā)動(dòng)機(jī)");
}
}
public interface CarFactory {
ITire createTire();
IEngine createEngine();
}
public class Q3Factory implements CarFactory{
@Override
public ITire createTire() {
return new NormalTire();
}
@Override
public IEngine createEngine() {
return new DemesticEngine();
}
}
public class Q7Factory implements CarFactory{
@Override
public ITire createTire() {
return new SUVTire();
}
@Override
public IEngine createEngine() {
return new ImportEngine();
}
}
最后調(diào)用
Q3Factory q3Factory = new Q3Factory();
q3Factory.createEngine().engine();
q3Factory.createTire().tire();
Q7Factory q7Factory = new Q7Factory();
q7Factory.createEngine().engine();
q7Factory.createTire().tire();
輸出
01-07 22:14:38.730 9413-9413/? I/System.out: 國(guó)產(chǎn)發(fā)動(dòng)機(jī)
01-07 22:14:38.731 9413-9413/? I/System.out: 普通輪胎
01-07 22:14:38.732 9413-9413/? I/System.out: 進(jìn)口發(fā)動(dòng)機(jī)
01-07 22:14:38.732 9413-9413/? I/System.out: 越野輪胎