參考資料
http://blog.csdn.net/jason0539/article/details/23020989
http://blog.csdn.net/lmj623565791/article/details/24460585
使用場景
當(dāng)一些對象構(gòu)建十分復(fù)雜,而使用者想要直接拿到對象而不關(guān)注對象的創(chuàng)建過程時姐帚,可以使用工廠模式吏垮。對象的創(chuàng)建由工廠完成,用戶通過工廠拿到對象罐旗,不關(guān)注創(chuàng)建的過程膳汪。
工廠模式分類
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.工廠方法模式
工廠方法模式中有一種特殊的模式 ****簡單工廠模式****
(1).一個抽象產(chǎn)品類,可以派生出多個具體產(chǎn)品類九秀。
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).一個工廠類負責(zé)創(chuàng)建對象的過程遗嗽,外部通過該類拿到對象
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)然也可以通過反射的方式生成產(chǎn)品對象
public class Factory {
public <T extends BMW> T createBMW(Class<T> clazz) {
BMW product=(BMW)Class.forName(clazz.getName()).newInstance();
return (BMW)product;
}
}
簡單工廠模式的弊端:每增加一種新的車型,就要修改Factroy的switch對象鼓蜒。對于Factory對象來說不符合開閉原則痹换,因此
有了工廠方法模式。
二都弹、工廠方法模式.
1.抽象的產(chǎn)品類
2.抽象的工廠類娇豫,每個產(chǎn)品由一個工廠類負責(zé)。
3.每一個工廠負責(zé)一種產(chǎn)品的生產(chǎn)
優(yōu)勢: 工廠方法模式去掉了簡單工廠模式中工廠方法的靜態(tài)屬性畅厢,使得它可以被子類繼承冯痢。這樣在簡單工廠模式里集中在工廠方法上的壓力可以由工廠方法模式里不同的工廠子類來分擔(dān)。
工廠方法的弊端:當(dāng)產(chǎn)品類不斷增加時框杜,對應(yīng)的工廠類也不斷增加
1.抽象的產(chǎn)品類
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.抽象的工廠浦楣,每個產(chǎn)品的創(chuàng)建對應(yīng)一個工廠。
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)品時咪辱,根據(jù)產(chǎn)品的特點振劳,自身代碼構(gòu)建的需求,將具有同種特征的產(chǎn)品放到一個工廠下梧乘。該工廠創(chuàng)建多種產(chǎn)品澎迎,下面例子的工廠方法根據(jù)平臺是android還是ios來分類庐杨。
抽象工廠使用場景:適合多種產(chǎn)品(每種產(chǎn)品實現(xiàn)的方式不同)提供給不同的場景使用時选调,可以用抽象工廠。
http://blog.csdn.net/jason0539/article/details/44976775
抽象工廠的使用
1.定義要實現(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平臺下的button
}
}
public class IOSButton extends Button{
public void btn(){
//這是IOS平臺下的button
}
}
public class AndroidTextView extends TextView{
public void textview(){
//這是Android平臺下的TextView
}
}
public class IOSTextView extends TextView{
public void textview(){
//這是IOS平臺下的TextView
}
}
2.針對不同的使用場景提供工廠方法灵份,拋出對象
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();
};
}