參考資料
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();
};
}