簡單工廠
如果我們面臨著接口選擇問題我們應(yīng)該使用工廠的方式去創(chuàng)建代碼牵素。
使用工廠方法模式的使用鼎姊,不僅優(yōu)化的創(chuàng)建部分周瞎。也為以后的拓展留下良好的空間黄琼。
解讀
有一次面試的時候樊销,面試官問我這樣一個問題:“設(shè)計一個程序,他既能解析XML類型的數(shù)據(jù)脏款,也能解析json類型的數(shù)據(jù)围苫。說一下你的構(gòu)思〕肥Γ”這是真實發(fā)生的事件剂府。接下來,我給大家分享一下我的設(shè)計思路剃盾。
1:看到了這個問題的時候腺占,我首先想到的是,同樣都是解析痒谴,那么應(yīng)該抽象一個共同的父類衰伯。他們共同行為是解析(Parser).具體的解析實現(xiàn)應(yīng)該是子類自己去實現(xiàn)。
2:XML與json解析的創(chuàng)建過程可能會不一樣积蔚。但這個創(chuàng)建的行為意鲸,使用者可以不需要知道。(使用者只需要知道名稱就行了)
3:拓展方面,假如需要增加另外一種解析临扮。也可以在不破壞原來的代碼情況下增加论矾。為了更加方便使用者去使用這個對象。我可以使用工廠方法杆勇。
4:使用起來贪壳,能夠替換方便
實現(xiàn)關(guān)鍵
1:創(chuàng)建對象時不會對客戶端暴露創(chuàng)建邏輯,并且是通過使用一個共同的接口來指向新創(chuàng)建的對象蚜退。
2:如果想增加一個產(chǎn)品闰靴,只要擴展一個工廠類就可以。
Factory
抽象出共同行為钻注,共同的行為就是解析
public interface Parser {
//共同的行為就是解析蚂且。
public void onParser();
}
子類自己實現(xiàn)細(xì)節(jié)。
public class JsonParser implements Parser{
@Override
public void onParser() {
// TODO Auto-generated method stub
System.out.println("Json 解析");
}
}
public class XMLParser implements Parser{
@Override
public void onParser() {
// TODO Auto-generated method stub
System.out.println("XML 解析");
}
}
由于解析的對象幅恋,創(chuàng)建時可能是復(fù)雜的杏死,我們把這兩個對象放進工廠中“隱蔽”起來。只需要返回一個解析器的對象即可捆交。這也是為了使用起來更加方便淑翼。
public abstract class AbstractParserFactory {
//隱蔽創(chuàng)建過程
public abstract Parser create();
}
public class JsonParserFactory extends AbstractParserFactory{
//創(chuàng)建,并返回一個解析器
@Override
public Parser create() {
// TODO Auto-generated method stub
return new JsonParser();
}
}
public class XMLParserFactory extends AbstractParserFactory{
//創(chuàng)建品追,并返回一個解析器
@Override
public Parser create() {
// TODO Auto-generated method stub
return new XMLParser();
}
}
最后我們在客戶端使用起來就很方便玄括。
//工廠
// AbstractParserFactory factory = new JsonParserFactory();
AbstractParserFactory factory = new XMLParserFactory();
Parser parser = factory.create();
parser.onParser();
這樣設(shè)計,不僅使用簡單肉瓦,而且方便拓展遭京。 如果有需要可以在工廠中增加資質(zhì)判斷。