更新時(shí)間:2022-10-26 09:28:49 來源:動力節(jié)點(diǎn) 瀏覽924次
抽象工廠模式和工廠模式區(qū)別有哪些?小編來告訴大家。
簡單工廠說白了就是一個超級工廠,他可以生產(chǎn)各種各樣的產(chǎn)品,產(chǎn)品之間無關(guān)聯(lián),比如:
public interface SimpleFactory {
//生產(chǎn)一個冰箱
Refrigerator createRefiger();
//生產(chǎn)一個空調(diào)
AirConditioning createAirConditioning();
//生產(chǎn)一個 TV
TV createTV();
}
一般也會有一個默認(rèn)的實(shí)現(xiàn):
public class DefaultSimpleFactory implements SimpleFactory{
@Override
public Refrigerator createRefiger() {
return new Refrigerator();
}
@Override
public AirConditioning createAirConditioning() {
return new AirConditioning();
}
@Override
public TV createTV() {
return new TV();
}
}
這就是一個簡單工廠模式,非常的簡單,還沒有很強(qiáng)的抽象性。
Spring 的 BeanFactory 其實(shí)就是一個簡單工廠模式,他定義了一個 BeanFactory 工廠,然后會有 DefaultListableBeanFactory 去實(shí)現(xiàn)這個工廠聲明的所有能力。
其實(shí)理論上來說,可以把簡單工廠模式理解為工廠方法模式的一種特例,將他的那個超級大工廠拆分成多個工廠就是工廠方法模式了。
同樣有一個抽象接口表述一個工廠:
public interface MethodFactory {
//生產(chǎn)一個冰箱
Refrigerator createRefiger();
//生產(chǎn)一個空調(diào)
AirConditioning createAirConditioning();
//生產(chǎn)一個 TV
TV createTV();
}
簡單工廠是用一個 DefaultFactory 完成了工廠所有的能力要求。但是現(xiàn)在我們的廠家變多了,有格力冰箱、海爾冰箱、海信冰箱等等,他們生產(chǎn)的冰箱或空調(diào)都不一樣,如果用簡單工廠的話,就需要做區(qū)分,增加更多的方法,生產(chǎn)格力冰箱的,生產(chǎn)海爾冰箱的,非常的丑陋。
工廠方法模式,需要區(qū)分不同的工廠,這里我們創(chuàng)建格力工廠、海爾工廠和海信工廠。
public class GeliFactory implements MethodFactory {
@Override
public Refrigerator createRefiger() {
return new GeliRefrigerator();
}
@Override
public AirConditioning createAirConditioning() {
return new GeliAirConditioning();
}
@Override
public TV createTV() {
return new GeliTV();
}
}
格力工廠返回的是格力的空調(diào)、格力的冰箱以及格力的電視機(jī),海爾和海信也都會返回他們自己品牌的產(chǎn)品,這里就不貼他們的代碼了,類似。
這樣,我們的工廠方法對外提供了生產(chǎn)產(chǎn)品的能力,具體產(chǎn)生何種類型的產(chǎn)品,將由具體的工廠決定。這就是工廠方法模式,相信大部分人應(yīng)該都不陌生。
Logpack 中就有一個典型的工廠方法,工廠抽象類 ILoggerFactory:
public interface ILoggerFactory {
Logger getLogger(String var1);
}
他有兩個具體的工廠實(shí)現(xiàn)這個 getLogger 方法,
public class NOPLoggerFactory implements ILoggerFactory {
public NOPLoggerFactory() {
}
public Logger getLogger(String name) {
return NOPLogger.NOP_LOGGER;
}
}
public class SubstituteLoggerFactory
implements ILoggerFactory {
//省略
public synchronized Logger getLogger(String name) {
SubstituteLogger logger = (SubstituteLogger)this.loggers.get(name);
if (logger == null) {
logger = new SubstituteLogger(name, this.eventQueue, this.postInitialization);
this.loggers.put(name, logger);
}
return logger;
}//省略。。。。。
}
抽象工廠模式可能不如前兩者常見,但是確是為了補(bǔ)充前兩者的,有特定的場景。
想象這么一種情況,你使用了工廠方法模式,你的工廠提供的能力非常多,可以生產(chǎn)冰箱、電視、空調(diào)、洗衣機(jī)、電腦以及桌子等等,這樣你就會產(chǎn)生很多的工廠。
抽象工廠的作用就是在一定前提下,幫你分類這些工廠,比如按品牌分類,或者按照價(jià)格等級分類,這樣會大大縮減系統(tǒng)中的工廠數(shù)量。
這個前提就是你的這些工廠需要在兩個維度上具備共性:
專業(yè)術(shù)語就是『產(chǎn)品等級』和『產(chǎn)品族』兩個概念,說人話就是,這些工廠需要至少具有兩個共性,比如都可以按照類型區(qū)分成三類,電視機(jī)、冰箱和空調(diào),也可以按照品牌區(qū)分成海爾、海信和 TCL。
這樣他們就具備抽象工廠的前提條件,你可以按照產(chǎn)品族合并工廠,正如上面使用到的例子一樣,工廠對外提供生產(chǎn)電視、冰箱和空調(diào)三種能力,而系統(tǒng)按品牌存在三個工廠,所以從準(zhǔn)確來說,在工廠方法中使用的例子其實(shí)也是加強(qiáng)版的抽象工廠模式。
代碼例子就不舉例了,抽象工廠其實(shí)就是幫助減少系統(tǒng)的工廠數(shù)量的,但前提條件就是這些工廠要具備兩個及以上的共性。
希望你被面試官問道工廠方法和抽象工廠的區(qū)別的時(shí)候,能想起這一句話。
初級 202925
初級 203221
初級 202629
初級 203743