淺談工廠和建造者模式

最近在寫安卓項(xiàng)目,在引入rxJava和Retrofit發(fā)現(xiàn)大量引用的建造者模式。那在此就記錄和簡單介紹一下兩者的區(qū)別和使用方法。
工廠模式和建造者模式都屬于創(chuàng)建型模式,它對類的實(shí)例化進(jìn)行了抽象。

1、1 工廠模式

工廠模式是我們最常用的實(shí)例化對象模式了,是用工廠方法代替new操作的一種模式。

1、2 應(yīng)用場景

  1. 對象的創(chuàng)建過程/實(shí)例化準(zhǔn)備工作很復(fù)雜,需要初始化很多參數(shù)、查詢數(shù)據(jù)庫等。

2.類本身有好多子類,這些類的創(chuàng)建過程在業(yè)務(wù)中容易發(fā)生改變,或者對類的調(diào)用容易發(fā)生改變。
舉個(gè)例子:自主創(chuàng)建需要的產(chǎn)品對象(小米和蘋果),達(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ū)別在于:工廠方法模式針對的是一個(gè)產(chǎn)品等級結(jié)構(gòu),而抽象工廠模式則針對的是多個(gè)產(chǎn)品等級結(jié)構(gòu)。
優(yōu)點(diǎn):抽象工廠模式同樣具備隔離具體類生成。并且當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對象設(shè)計(jì)成一起工作時(shí),他能夠保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對象。
缺點(diǎn):再添加新的產(chǎn)品對象時(shí),難以擴(kuò)展抽象工廠模式以便產(chǎn)生新種類產(chǎn)品。
然后比較最多的應(yīng)該就是抽象工廠和建造者模式,下面就簡單介紹一下建造者模式。

2、1建造者模式

建造者模式(Builder Pattern)使用多個(gè)簡單的對象一步一步構(gòu)建成一個(gè)復(fù)雜的對象。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。
一個(gè) Builder 類會一步一步構(gòu)造最終的對象。該 Builder 類是獨(dú)立于其他對象的。

2.2應(yīng)用場景

1、需要生成的對象具有復(fù)雜的內(nèi)部結(jié)構(gòu)。
2、需要生成的對象內(nèi)部屬性本身相互依賴。
舉個(gè)例子:1、工廠(建造者模式):負(fù)責(zé)制造汽車(組裝過程和細(xì)節(jié)在工廠內(nèi))
2、汽車購買者(用戶):你只需要說出你需要的型號(對象的類型和內(nèi)容),然后直接購買就可以使用了
(不需要知道汽車是怎么組裝的(車輪、車門、發(fā)動(dòng)機(jī)、方向盤等等))

2、3 建造者模式代碼

示例分析:
1、小高定制買車,老板(Diretor)和小高(Client)進(jìn)行需求溝通(越野?日常?撩妹?)
2、了解需求后,電腦城老板將小高需求劃分為各個(gè)部件(Builder)的建造請求(發(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(“組裝完成,請驗(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ù)雜,可能會導(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)用場景截然不同,如果希望屏蔽對象的創(chuàng)建過程,只提供一個(gè)封裝良好的對象,則可以選擇抽象工廠方法模式。而建造者模式可以用在構(gòu)件的裝配方面,如通過裝配不同的組件或者相同組件的不同順序,可以產(chǎn)生出一個(gè)新的對象,它可以產(chǎn)生一個(gè)非常靈活的架構(gòu),方便地?cái)U(kuò)展和維護(hù)系統(tǒng)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容