淺談工廠和建造者模式

最近在寫安卓項(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)景

  1. 對(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)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末或渤,一起剝皮案震驚了整個(gè)濱河市系冗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薪鹦,老刑警劉巖掌敬,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異池磁,居然都是意外死亡奔害,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門地熄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來华临,“玉大人,你說我怎么就攤上這事端考⊙盘叮” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵却特,是天一觀的道長(zhǎng)扶供。 經(jīng)常有香客問我,道長(zhǎng)裂明,這世上最難降的妖魔是什么椿浓? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮闽晦,結(jié)果婚禮上轰绵,老公的妹妹穿的比我還像新娘。我一直安慰自己尼荆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布唧垦。 她就那樣靜靜地躺著捅儒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巧还,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天鞭莽,我揣著相機(jī)與錄音,去河邊找鬼麸祷。 笑死澎怒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阶牍。 我是一名探鬼主播喷面,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼走孽!你這毒婦竟也來了鞋拟?” 一聲冷哼從身側(cè)響起颅和,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后乖杠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荆残,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年啼肩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硕盹。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡符匾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莱睁,到底是詐尸還是另有隱情待讳,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布仰剿,位于F島的核電站创淡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏南吮。R本人自食惡果不足惜琳彩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望部凑。 院中可真熱鬧露乏,春花似錦、人聲如沸涂邀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽比勉。三九已至劳较,卻和暖如春驹止,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背观蜗。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工臊恋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人墓捻。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓抖仅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親砖第。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撤卢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容