最近在寫安卓項(xiàng)目挡鞍,在引入rxJava和Retrofit發(fā)現(xiàn)大量引用的建造者模式。那在此就記錄和簡(jiǎn)單介紹一下兩者的區(qū)別和使用方法预烙。
工廠模式和建造者模式都屬于創(chuàng)建型模式墨微,它對(duì)類的實(shí)例化進(jìn)行了抽象。
1扁掸、1 工廠模式
工廠模式是我們最常用的實(shí)例化對(duì)象模式了翘县,是用工廠方法代替new操作的一種模式。
1谴分、2 應(yīng)用場(chǎng)景
- 對(duì)象的創(chuàng)建過程/實(shí)例化準(zhǔn)備工作很復(fù)雜锈麸,需要初始化很多參數(shù)、查詢數(shù)據(jù)庫等狸剃。
2.類本身有好多子類掐隐,這些類的創(chuàng)建過程在業(yè)務(wù)中容易發(fā)生改變,或者對(duì)類的調(diào)用容易發(fā)生改變。
舉個(gè)例子:自主創(chuàng)建需要的產(chǎn)品對(duì)象(小米和蘋果)虑省,達(dá)到增加新產(chǎn)品時(shí)無需修改其他具體的工廠和具體類的目的匿刮。
1.3 工廠模式代碼
/**
* 手機(jī)接口
* @author li
*/
public interface Moblie{
// TODO
}
/**
* 手機(jī)工廠接口
* @author li
*/
public interface MobileFactor{
public Moblie productMobile();
}
public class iphone implements Moblie {
// TODO
}
public class Mi implements Moblie {
// TODO
}
public class MotorolaFactor implements MobileFactor {
@Override
public Moblie productMobile() {
return new iphone ();
}
}
public class NokiaFactor implements MobileFactor {
@Override
public Moblie productMobile() {
return new Mi();
}
}
主類:
public static void main(String[] args) {
MobileFactor mf = new MI Factor(); // 需要什么產(chǎn)品就創(chuàng)造什么工廠
Moblie m;
m = mf.productMobile();
}
1、4抽象工廠的使用
1.4.1 定義接口
public abstract class ComputerFactor{
CPU cpu;
HardDisk hd;
MainBoard mb;
public void show() {
// 利用傳進(jìn)來的組件做事
}
}
1.4.3 實(shí)現(xiàn)類
public class IBM extends ComputerFactor {
public IBM() {
cpu = new AMD();
hd = new Maxtor();
mb = new MSIK7N2G();
}
}
1.4.3主類
public static void main(String[] args) {
IBM ibm = new IBM();
ibm.show();
}
1.4.4 抽象工廠優(yōu)缺點(diǎn)
抽象工廠模式與工廠方法模式最大的區(qū)別在于:工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)探颈,而抽象工廠模式則針對(duì)的是多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)熟丸。
優(yōu)點(diǎn):抽象工廠模式同樣具備隔離具體類生成。并且當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對(duì)象設(shè)計(jì)成一起工作時(shí)伪节,他能夠保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對(duì)象光羞。
缺點(diǎn):再添加新的產(chǎn)品對(duì)象時(shí),難以擴(kuò)展抽象工廠模式以便產(chǎn)生新種類產(chǎn)品怀大。
然后比較最多的應(yīng)該就是抽象工廠和建造者模式纱兑,下面就簡(jiǎn)單介紹一下建造者模式。
2化借、1建造者模式
建造者模式(Builder Pattern)使用多個(gè)簡(jiǎn)單的對(duì)象一步一步構(gòu)建成一個(gè)復(fù)雜的對(duì)象潜慎。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式蓖康。
一個(gè) Builder 類會(huì)一步一步構(gòu)造最終的對(duì)象铐炫。該 Builder 類是獨(dú)立于其他對(duì)象的。
2.2應(yīng)用場(chǎng)景
1蒜焊、需要生成的對(duì)象具有復(fù)雜的內(nèi)部結(jié)構(gòu)倒信。
2、需要生成的對(duì)象內(nèi)部屬性本身相互依賴泳梆。
舉個(gè)例子:1鳖悠、工廠(建造者模式):負(fù)責(zé)制造汽車(組裝過程和細(xì)節(jié)在工廠內(nèi))
2、汽車購買者(用戶):你只需要說出你需要的型號(hào)(對(duì)象的類型和內(nèi)容)优妙,然后直接購買就可以使用了
(不需要知道汽車是怎么組裝的(車輪竞穷、車門、發(fā)動(dòng)機(jī)鳞溉、方向盤等等))
2、3 建造者模式代碼
示例分析:
1鼠哥、小高定制買車熟菲,老板(Diretor)和小高(Client)進(jìn)行需求溝通(越野?日常朴恳?撩妹抄罕?)
2、了解需求后于颖,電腦城老板將小高需求劃分為各個(gè)部件(Builder)的建造請(qǐng)求(發(fā)動(dòng)機(jī)呆贿、車身、顏色)
3、指揮裝機(jī)人員(ConcreteBuilder)去構(gòu)建組件做入;
4冒晰、將組件組裝起來成小高需要的汽車(Product)
2、3竟块、1定義組裝過程(Builder):組裝汽車的過程
public abstract class Builder {
//第一步:裝發(fā)動(dòng)機(jī)
public abstract void BuildEngine()壶运;
//第二步:裝車身
public abstract void BuildBody();
//第三步:車身顏色
public abstract void BuildColor()浪秘;
//返回產(chǎn)品的方法:獲得組裝好的汽車
public abstract Car GetCcar()蒋情;
}
2、3耸携、2 老板委派任務(wù)給組裝人員(Director)
public class Director{
//指揮裝機(jī)人員組裝電腦
public void Construct(Builder builder){
builder. BuildEngine();
builder.BuildBody()棵癣;;
builder. BuildColor();
}
}
2夺衍、3狈谊、3創(chuàng)建具體的建造者(ConcreteBuilder):組裝人員
//裝車人員
public class ConcreteBuilder extend Builder{
//創(chuàng)建產(chǎn)品實(shí)例
Car car = new Car();
//組裝產(chǎn)品
@Override
public void BuildEngine(){
car.Add("組裝發(fā)動(dòng)機(jī)")
}
@Override
public void BuildBody(){
car.Add("組裝車身")
}
@Override
public void BuildColor(){
car.Add("噴漆")
}
//返回組裝成功的汽車
@Override
public Car GetCar(){
return car
}
}
2、3刷后、4定義具體產(chǎn)品類(Product):汽車
public class Car{
//汽車組件的集合
private List<String> parts = new ArrayList<String>()的畴;
//用于將組件組裝到汽車?yán)? public void Add(String part){
parts.add(part);
}
public void Show(){
for (int i = 0;i<parts.size();i++){
System.out.println(“組件”+parts.get(i)+“裝好了”);
}
System.out.println(“組裝完成,請(qǐng)驗(yàn)收”);
}
}
2尝胆、3丧裁、5客戶端調(diào)用-買車
public class Builder Pattern{
public static void main(String[] args){
//逛了很久終于發(fā)現(xiàn)一家合適的汽車店
//找到該店的老板和裝機(jī)人員
Director director = new Director();
Builder builder = new ConcreteBuilder();
//溝通需求后,老板叫裝機(jī)人員去裝電腦
director.Construct(builder);
//裝完后含衔,組裝人員搬來組裝好的電腦
Car car = builder.GetCar();
//組裝人員展示電腦給小高看
car.Show()煎娇;
}
}
2、4 建造模式優(yōu)缺點(diǎn)
優(yōu)點(diǎn):1贪染、將產(chǎn)品本身與產(chǎn)品創(chuàng)建過程進(jìn)行解耦缓呛,可以使用相同的創(chuàng)建過程來得到不同的產(chǎn)品。也就說細(xì)節(jié)依賴抽象杭隙。
2哟绊、將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過程更加清晰痰憎。
缺點(diǎn):如果產(chǎn)品的內(nèi)部變化復(fù)雜票髓,可能會(huì)導(dǎo)致需要定義很多具體建造者類來實(shí)現(xiàn)這種變化,導(dǎo)致系統(tǒng)變得很龐大铣耘。
3抽象工廠和建造者模式的區(qū)別
抽象工廠模式比建造者模式的尺度要大洽沟,它關(guān)注產(chǎn)品整體,而建造者模式關(guān)注構(gòu)建過程蜗细,因此建造者模式可以很容易地構(gòu)建出一個(gè)嶄新的產(chǎn)品裆操,只要導(dǎo)演類能夠提供具體的工藝流程。也正因?yàn)槿绱耍瑑烧叩膽?yīng)用場(chǎng)景截然不同踪区,如果希望屏蔽對(duì)象的創(chuàng)建過程昆烁,只提供一個(gè)封裝良好的對(duì)象,則可以選擇抽象工廠方法模式朽缴。而建造者模式可以用在構(gòu)件的裝配方面善玫,如通過裝配不同的組件或者相同組件的不同順序,可以產(chǎn)生出一個(gè)新的對(duì)象密强,它可以產(chǎn)生一個(gè)非常靈活的架構(gòu)茅郎,方便地?cái)U(kuò)展和維護(hù)系統(tǒng)。