<big>版權(quán)聲明:本文為 Codeagles 原創(chuàng)文章禽作,可以隨意轉(zhuǎn)載扮叨,但必須在明確位置注明出處!A炻酢彻磁!</big>
工廠模式
工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計(jì)模式之一±晖保看到這個(gè)名字不難想象到我們要做什么衷蜓,當(dāng)然就是創(chuàng)造工廠,那么工廠是干什么的尘喝?當(dāng)然是生產(chǎn)創(chuàng)造用的了磁浇,生產(chǎn)什么呢?JAVA中一切萬物皆對象朽褪,工廠用來生產(chǎn)對象置吓。
工廠模式通常分為:
- 簡單工廠模式
- 工廠方法模式
- 抽象工廠模式
想要用工廠模式,那就要知道這么幾個(gè)問題:
- 為什么要用
- 有什么好處
- 有什么壞處
- 怎么用
OK缔赠,其他的細(xì)枝末節(jié)先不深入衍锚,先搞懂這幾個(gè)問題就好了,深入的隨著理解和實(shí)踐嗤堰,認(rèn)知也會越來越深入的戴质。
首先,為什么要用踢匣?
我們知道設(shè)計(jì)模式無疑就是通過經(jīng)驗(yàn)來總結(jié)出比較合理的代碼結(jié)構(gòu)告匠,目的也很明確,掛在嘴邊的高內(nèi)聚离唬、低耦合后专,設(shè)計(jì)模式為了解耦,代碼更合理输莺。
有什么好處呢戚哎?
- 擴(kuò)展性高
- 讓調(diào)用者只用接口裸诽,而不去注重內(nèi)部實(shí)現(xiàn)
- 當(dāng)然最好的就是,調(diào)用者只需要知道對象名字就可以建瘫,不需要關(guān)注怎么創(chuàng)建崭捍。(創(chuàng)建由子類進(jìn)行)
有什么壞處呢尸折?
相對也是顯而易見的啰脚,每次增加一個(gè)需求或者說產(chǎn)品,都要對應(yīng)增加一個(gè)對象工廠以及實(shí)例類实夹,如果系統(tǒng)很大橄浓,那么類個(gè)數(shù)是巨多的,無疑維護(hù)成本提升了亮航。
那么荸实,最后一個(gè)問題怎么用?
Talk is cheap, show me the code.
簡單工廠
package design;
//抽象機(jī)器
abstract class Mechine {
public abstract void move();
public abstract void stop();
}
// 抽象機(jī)器實(shí)例——汽車
class Car extends Mechine {
@Override
public void move() {
System.out.println("汽車正以80邁速度駛過來缴淋。准给。。");
}
@Override
public void stop() {
System.out.println("一腳急剎車重抖,滑行20米停下來了露氮。。");
}
}
// 抽象機(jī)器實(shí)例——飛機(jī)
class Airplane extends Mechine {
@Override
public void move() {
System.out.println("飛機(jī)正在起飛钟沛。畔规。。");
}
@Override
public void stop() {
System.out.println("飛機(jī)準(zhǔn)備降落恨统。叁扫。。");
}
}
//簡單工廠
public class MechineFactory {
public static Mechine createMechine(String mechineName) {
Mechine mechine = null;
if(mechineName.equals("car")){
mechine= new Car();
}
if(mechineName.equals("airplane")){
mechine= new Airplane();
}
return mechine;
}
}
public class Boss {
public static void main(String[] args) {
// Boss下令“我要造一輛轎車,現(xiàn)在馬上畜埋!會動的莫绣!”
// 機(jī)器工廠接到指令,立即開始做ing悠鞍。兔综。。
Mechine mechine = MechineFactory.createMechine("car");
mechine.move();
//Boss:"我好幾個(gè)億的生產(chǎn)線不能這么放著狞玛,造一輛飛機(jī)软驰,會飛會降落的"
mechine = MechineFactory.createMechine("airplane");
mechine.move();
mechine.stop();
}
}
這就是簡單工廠,那么工廠方法模式心肪,其實(shí)是簡單工廠的擴(kuò)展锭亏,說白了就是簡單工廠抽象化。
工廠方法模式
package design;
//抽象機(jī)器
abstract class Mechine {
public abstract void move();
public abstract void stop();
}
// 抽象機(jī)器實(shí)例——汽車
class Car extends Mechine {
@Override
public void move() {
System.out.println("汽車正以80邁速度駛過來硬鞍。慧瘤。戴已。");
}
@Override
public void stop() {
System.out.println("一腳急剎車,滑行20米停下來了锅减。糖儡。");
}
}
// 抽象機(jī)器實(shí)例——飛機(jī)
class Airplane extends Mechine {
@Override
public void move() {
System.out.println("飛機(jī)正在起飛。怔匣。握联。");
}
@Override
public void stop() {
System.out.println("飛機(jī)準(zhǔn)備降落。每瞒。金闽。");
}
}
//簡單工廠抽象化
abstract class MechineFactory {
public abstract Mechine createMechine(String mechineName);
}
//汽車工廠--只負(fù)責(zé)創(chuàng)建汽車
public class CarFactory extends MechineFactory{
@Override
public Mechine createMechine(String mechineName) {
return new Car();
}
}
public class Boss {
public static void main(String[] args) {
// Boss下令“我要造一輛轎車,現(xiàn)在馬上!會動的剿骨!”
// 機(jī)器工廠接到指令代芜,立即開始做
MechineFactory mf = new CarFactory();
Mechine m=mf.createMechine("car");
m.move();
}
}
show完code是不是有點(diǎn)概念了,當(dāng)然模式只是模式浓利,還有很多種寫法挤庇,只要是這種思想就可以,比如還可用接口implement來寫,那樣更好理解贷掖,這里給出這種寫法嫡秕,也是自己想鍛煉一下。
總結(jié)
這里只講了前兩種羽资,至于抽象工廠淘菩,后續(xù)更新。簡單工廠和工廠方法區(qū)別在于屠升,一個(gè)用工廠創(chuàng)建對象潮改,一個(gè)用工廠創(chuàng)建單一產(chǎn)品工廠在創(chuàng)建對象。