image
設(shè)計模式是一種非常有用的編程技巧旭从,它對于代碼的重構(gòu)有些非常重要的作用,對于軟件開發(fā)人員來說渔欢,需要理解并嘗試著使用這些設(shè)計的方法猛拴。
個人感覺《設(shè)計模式之禪》這本書中講解的非常具體,每個模式都配以適當?shù)睦酉技瘢浅_m合學(xué)習(xí)設(shè)計模式的初學(xué)者坐漏,當然,程杰的《大話設(shè)計模式》也是非常好的一本書碧信,都可以拿過來當做一本工具書隨時查看理解設(shè)計的奧妙赊琳。
工廠模式
這個模式的名字就已經(jīng)告訴了我們它想要做什么,就是讓我們構(gòu)造出一個工廠砰碴,然后生產(chǎn)我們需要的東西躏筏,即生成對象。那么呈枉,為什么要構(gòu)造一個工廠呢趁尼,為什么不直接在代碼中直接 new 一個出來呢?
想象這樣一種情況:有時我們設(shè)計一類東西時猖辫,這一類又包含有許多的具體類酥泞,那么,當我們需要得到這些對象時啃憎,如果我們一個一個的 new 出來芝囤,就會顯得很粗糙,而且如果構(gòu)造這些對象時,需要進行一些必要的初始化悯姊,而這些初始化操作對于這一類對象都是相似的羡藐,那么,我們的代碼中就會顯得非常的冗余悯许,在 new 之后會出現(xiàn)很多相似的初始化對象代碼仆嗦。
這時,你就會想岸晦,有這樣一個東西欧啤,我只需要告訴它,我需要那個對象启上,那么邢隧,它就會生成那個對象,而且我不需要考慮到它實際的實現(xiàn)細節(jié)冈在。那么這個東西就叫做工廠倒慧。
工廠模式分為三類:
簡單工廠模式,工廠模式包券,抽象工廠模式
下面就分別對這三個模式進行介紹
簡單工廠模式
這是最簡單的工廠模式類型纫谅,一般的設(shè)計會出現(xiàn)三個類或接口:
1> 抽象產(chǎn)品類或者產(chǎn)品接口
2> 具體產(chǎn)品類
3> 工廠類
注:這里我想多說幾句關(guān)于抽象類和接口的區(qū)別,抽象類和接口是非常相似的東西溅固,大部分時候它是可以互相代替的付秕,那么它們之間存在什么不同呢?我們從名字中可以看出一個是對一類對象的抽象侍郭,一個是類的接口询吴。舉一個例子就好像這樣,人分為黃種人亮元,白種人猛计。。爆捞。奉瘤,那么,對于人煮甥,我們需要設(shè)計出一個抽象類還是接口呢盗温?應(yīng)該設(shè)計成為抽象類,因為成肘,它是對人類的抽象肌访,所有的人都應(yīng)該具有這個特征。接口呢艇劫,什么應(yīng)該設(shè)計成為接口呢?就好像人的愛好一樣,比如店煞,游泳蟹演,臺球,乒乓球(這些都是我的愛好顷蟀,哈哈)酒请,它是后天養(yǎng)成的東西,是需要具體的實現(xiàn)的鸣个,所以羞反,這些應(yīng)該是設(shè)計成為接口,所以囤萤,一個黃種人的類就好像下面這樣:
public class YellowHuman extends Human implements Swimming, PingPang ... { }
好的昼窗,回到前面的簡單工廠里面,說它簡單涛舍,因為這個模式只需要實現(xiàn)一個工廠類就能生產(chǎn)出我們需要的產(chǎn)品澄惊,還是以人種的例子(“著名的”女媧造人)做出說明。
女媧制造出各種人種富雅,黃種人掸驱,白種人,黑種人没佑,首先毕贼,人具有的共同特點構(gòu)造出一個抽象類:
1.接口定義一個人類的統(tǒng)稱
/**
* Created by wanggs on 2017/7/14.
*/
public interface Human {
public abstract void laugh();
public abstract void cry();
public abstract void talk();
}
2.然后定義具體的人種:
package com.wanggs.factory;
/**
* Created by wanggs on 2017/7/14.
*/
public class WhiteHuman implements Human {
@Override
public void laugh() {
System.out.println("WhiteHuman.laugh");
}
@Override
public void cry() {
System.out.println("WhiteHuman.cry");
}
@Override
public void talk() {
System.out.println("WhiteHuman.talk");
}
}
package com.wanggs.factory;
/**
* Created by wanggs on 2017/7/14.
*/
public class YellowHuman implements Human {
@Override
public void laugh() {
System.out.println("YellowHuman.laugh");
}
@Override
public void cry() {
System.out.println("YellowHuman.cry");
}
@Override
public void talk() {
System.out.println("YellowHuman.talk");
}
}
3.人的工廠
package com.wanggs.factory;
/**
* Created by wanggs on 2017/7/14.
*/
public class HumanFactory {
// 第一版
/* public static Human produceHuman(String type) {
if ("yellow".equals(type)) {
return new YellowHuman();
} else if ("white".equals(type)) {
return new WhiteHuman();
} else if ("black".equals(type)) {
return new BlackHuman();
}
System.out.println("有誤");
return null;
}*/
//第二版
/* public static Human produceYellow() {
return new YellowHuman();
}
public static Human produceBlack() {
return new BlackHuman();
}*/
//第三版 使用反射
public static Human createHuman(Class c) {
Human human = null;
try {
human = (Human) Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
System.out.println("顏色");
} catch (IllegalAccessException e) {
System.out.println("人定義錯誤");
} catch (ClassNotFoundException e) {
System.out.println("null");
}
return human;
}
}
4. 測試
package com.wanggs.factory;
/**
* Created by wanggs on 2017/7/14.
*/
public class NvWa {
public static void main(String[] args) {
Human human = HumanFactory.createHuman(YellowHuman.class);
human.laugh();
}
}