工廠模式的理解

參考資料

http://blog.csdn.net/jason0539/article/details/23020989
http://blog.csdn.net/lmj623565791/article/details/24460585

使用場(chǎng)景

當(dāng)一些對(duì)象構(gòu)建十分復(fù)雜,而使用者想要直接拿到對(duì)象而不關(guān)注對(duì)象的創(chuàng)建過(guò)程時(shí),可以使用工廠模式。對(duì)象的創(chuàng)建由工廠完成,用戶(hù)通過(guò)工廠拿到對(duì)象,不關(guān)注創(chuàng)建的過(guò)程。

工廠模式分類(lèi)

1.靜態(tài)工廠模式

public class BitmapUtils { 
   public static Bitmap zoomImg(String img, int newWidth, int newHeight) {/
/ 圖片源   
     Bitmap bm = BitmapFactory.decodeFile(img);    
    if (null != bm) {      
      return zoomImg(bm, newWidth, newHeight);       
 }       
 return null;    
}

2.工廠方法模式
工廠方法模式中有一種特殊的模式 ****簡(jiǎn)單工廠模式****
(1).一個(gè)抽象產(chǎn)品類(lèi),可以派生出多個(gè)具體產(chǎn)品類(lèi)。

abstract class BMW {  
    public BMW(){  
          
    }  
}  
  
public class BMW320 extends BMW {  
    public BMW320() {  
        System.out.println("制造-->BMW320");  
    }  
}  
public class BMW523 extends BMW{  
    public BMW523(){  
        System.out.println("制造-->BMW523");  
    }  
}  

(2).一個(gè)工廠類(lèi)負(fù)責(zé)創(chuàng)建對(duì)象的過(guò)程,外部通過(guò)該類(lèi)拿到對(duì)象

public class Factory {  
    public BMW createBMW(int type) {  
        switch (type) {      

       case 320:  
            return new BMW320();  
       case 523:  
            return new BMW523();  
        default:  
            break;  
        }  
        return null;  
    }  
}  
當(dāng)然也可以通過(guò)反射的方式生成產(chǎn)品對(duì)象
public class Factory {  
    public <T extends BMW> T createBMW(Class<T> clazz) {  
        BMW product=(BMW)Class.forName(clazz.getName()).newInstance();
        return (BMW)product;  
    }  
}
簡(jiǎn)單工廠模式的弊端:每增加一種新的車(chē)型,就要修改Factroy的switch對(duì)象。對(duì)于Factory對(duì)象來(lái)說(shuō)不符合開(kāi)閉原則,因此
有了工廠方法模式。

二、工廠方法模式.

1.抽象的產(chǎn)品類(lèi)
2.抽象的工廠類(lèi),每個(gè)產(chǎn)品由一個(gè)工廠類(lèi)負(fù)責(zé)。
3.每一個(gè)工廠負(fù)責(zé)一種產(chǎn)品的生產(chǎn)
優(yōu)勢(shì): 工廠方法模式去掉了簡(jiǎn)單工廠模式中工廠方法的靜態(tài)屬性,使得它可以被子類(lèi)繼承。這樣在簡(jiǎn)單工廠模式里集中在工廠方法上的壓力可以由工廠方法模式里不同的工廠子類(lèi)來(lái)分擔(dān)。
工廠方法的弊端:當(dāng)產(chǎn)品類(lèi)不斷增加時(shí),對(duì)應(yīng)的工廠類(lèi)也不斷增加

1.抽象的產(chǎn)品類(lèi)
abstract class BMW {  
    public BMW(){  
          
    }  
}  
public class BMW320 extends BMW {  
    public BMW320() {  
        System.out.println("制造-->BMW320");  
    }  
}  
public class BMW523 extends BMW{  
    public BMW523(){  
        System.out.println("制造-->BMW523");  
    }  
}  
2.抽象的工廠,每個(gè)產(chǎn)品的創(chuàng)建對(duì)應(yīng)一個(gè)工廠。
interface FactoryBMW {  
    BMW createBMW();  
}  
  
public class FactoryBMW320 implements FactoryBMW{  
  
    @Override  
    public BMW320 createBMW() {  
  
        return new BMW320();  
    }  
  
}  
public class FactoryBMW523 implements FactoryBMW {  
    @Override  
    public BMW523 createBMW() {  
  
        return new BMW523();  
    }  
}  


3.抽象工廠

當(dāng)工廠需要生產(chǎn)多種產(chǎn)品時(shí),根據(jù)產(chǎn)品的特點(diǎn),自身代碼構(gòu)建的需求,將具有同種特征的產(chǎn)品放到一個(gè)工廠下。該工廠創(chuàng)建多種產(chǎn)品,下面例子的工廠方法根據(jù)平臺(tái)是android還是ios來(lái)分類(lèi)。

抽象工廠使用場(chǎng)景:適合多種產(chǎn)品(每種產(chǎn)品實(shí)現(xiàn)的方式不同)提供給不同的場(chǎng)景使用時(shí),可以用抽象工廠。

http://blog.csdn.net/jason0539/article/details/44976775

抽象工廠的使用

1.定義要實(shí)現(xiàn)的產(chǎn)品

public abstract class Button{
    public abstract  void  btn();
 }
public abstract class TextView{
    public abstract  void  textview();
 }
public class AndroidButton extends Button{
    public void  btn(){
       //這是Android平臺(tái)下的button
    }
 }
public class IOSButton extends Button{
    public void  btn(){
       //這是IOS平臺(tái)下的button
    }
 }
public class AndroidTextView extends TextView{
    public void  textview(){
       //這是Android平臺(tái)下的TextView
    }
 }
public class IOSTextView extends TextView{
    public void  textview(){
       //這是IOS平臺(tái)下的TextView
    }
 }

2.針對(duì)不同的使用場(chǎng)景提供工廠方法,拋出對(duì)象

 public abstract Factory{
    public abstract TextView getText();
    public abstract Button button(); 
 }

 public class AndroidFactory extends Factory{
    publict TextView getText(){
       return new AndroidTextView ();
    };
    public  Button button(){
         return new AndroidButton();
       }; 
 }

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

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

  • 1 場(chǎng)景問(wèn)題# 1.1 選擇組裝電腦的配件## 舉個(gè)生活中常見(jiàn)的例子——組裝電腦,我們?cè)诮M裝電腦的時(shí)候,通常需要選...
    七寸知架構(gòu)閱讀 4,538評(píng)論 6 67
  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,081評(píng)論 1 15
  • 1 場(chǎng)景問(wèn)題# 1.1 導(dǎo)出數(shù)據(jù)的應(yīng)用框架## 考慮這樣一個(gè)實(shí)際應(yīng)用:實(shí)現(xiàn)一個(gè)導(dǎo)出數(shù)據(jù)的應(yīng)用框架,來(lái)讓客戶(hù)選擇數(shù)據(jù)...
    七寸知架構(gòu)閱讀 7,011評(píng)論 6 75
  • 簡(jiǎn)單工廠模式雖然簡(jiǎn)單,但存在一個(gè)很?chē)?yán)重的問(wèn)題。當(dāng)系統(tǒng)中需要引入新產(chǎn)品時(shí),由于靜態(tài)工廠方法通過(guò)所傳入?yún)?shù)的不同來(lái)創(chuàng)建...
    justCode_閱讀 1,305評(píng)論 1 9
  • 炎夏趕集日記 一早趕集去,高溫?zé)救恕?路旁攤位擠,果蔬地上滿(mǎn)。 買(mǎi)主不甚多,菜價(jià)偏低沉。 偶有狡黠者,抬價(jià)亂蒙人...
    泠風(fēng)思語(yǔ)閱讀 268評(píng)論 0 2

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