濟寧網(wǎng)站建設(shè)專家seo入門基礎(chǔ)教程
設(shè)計模式—創(chuàng)建型模式之工廠模式
工廠模式(Factory Pattern)提供了一種創(chuàng)建對象的最佳方式。我們不必關(guān)心對象的創(chuàng)建細節(jié),只需要根據(jù)不同情況獲取不同產(chǎn)品即可。
簡單工廠模式
比如我們有造車的工廠,來生產(chǎn)車,我們先定義一個抽象車產(chǎn)品:
//抽象車產(chǎn)品類
public abstract class AbstractCar { String engine;public abstract void run();
}
我們有兩個具體的產(chǎn)品,貨車和家用小汽車,都繼承自抽象車:
//貨車
public class Truck extends AbstractCar{public Truck() {this.engine = "貨車引擎";}@Overridepublic void run() {System.out.println(this.engine+"--->正在運行");}
}
//家用小汽車
public class MiniCar extends AbstractCar{public MiniCar() {this.engine = "家用小汽車引擎";}@Overridepublic void run() {System.out.println(this.engine + "----------》正在運行");}
}
那我們的工廠可以如此定義:
public class MySimpleFactory {/*** 獲取車* @param type* @return*/public AbstractCar newCar(String type){if("truck".equals(type)){return new Truck();}else if("mini".equals(type)){return new MiniCar();}return null;}
}
一般簡單工廠生產(chǎn)的產(chǎn)品優(yōu)先。
測試類如下:
public class SimpleFactoryTest {public static void main(String[] args) {MySimpleFactory factory = new MySimpleFactory();AbstractCar truck = factory.newCar("truck");AbstractCar mini = factory.newCar("mini");truck.run();mini.run();}
}
運行如下:
缺點
**違反了開閉原則,擴展不易。**如果有大量的產(chǎn)品,會有大量的if else。
工廠方法模式
因為簡單工廠模式,會出現(xiàn)大量的if else,并不能滿足打開擴展、關(guān)閉修改的原則,我們希望,如果有擴展,直接擴展一個類就好,不區(qū)改動創(chuàng)造類型的代碼,這樣工廠方法模式就出現(xiàn)了。我們可以把工廠再進行抽象,把我們的工廠提升一個層次。
抽象類或者接口,就會有多個實現(xiàn);有多實現(xiàn) 就會有多功能。
抽象工廠如下:
public abstract class AbstarctCarFactory {public abstract AbstractCar newCar();
}
我們的貨車、小汽車,分別由不同的工廠來創(chuàng)建:
//貨車工廠
public class TruckFactory extends AbstarctCarFactory {@Overridepublic AbstractCar newCar() {return new Truck();}
}
//小汽車工廠
public class MiniCarFactory extends AbstarctCarFactory {@Overridepublic AbstractCar newCar() {return new MiniCar();}
}
測試類如下:
public class FactoryMethodTest {public static void main(String[] args) {AbstarctCarFactory miniCarFactory = new MiniCarFactory();AbstractCar miniCar = miniCarFactory.newCar();miniCar.run();TruckFactory truckFactory = new TruckFactory();AbstractCar truck = truckFactory.newCar();truck.run();}
}
運行結(jié)果如下:
這樣,如果我們有新的類型,可以直接繼承這個抽象工廠即可。
缺點
系統(tǒng)復(fù)雜度增加,可創(chuàng)建的品類單一。
抽象工廠模式
我們先來區(qū)分兩個概念:
- 產(chǎn)品等級:比如手機可以分為低配版手機、高配版手機;產(chǎn)品等級結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu),如抽象類為手機,可以有拍照手機、游戲手機等等。
- 產(chǎn)品族:產(chǎn)品可以分為手機、汽車等,這是產(chǎn)品族。在抽象工廠模式中,產(chǎn)品族是指由同一個工廠生產(chǎn)的,位于不同產(chǎn)品等級結(jié)構(gòu)中的一組產(chǎn)品。
在車的產(chǎn)品基礎(chǔ)上,我們又增加了新的產(chǎn)品,手機。
public abstract class AbstractPhone {//手機類型String type;public abstract void run();
}public class GamePhone extends AbstractPhone {public GamePhone() {this.type = "游戲手機";}@Overridepublic void run() {System.out.println(this.type + "正在運行了...");}
}public class MyPhotoPhoneFactory implements MyAbstarctFactory{@Overridepublic AbstractPhone newPhone() {return new PhotoPhone();}
}
如果我們想生產(chǎn)車和手機,我們可以定義抽象工廠:
public interface MyAbstarctFactory {default AbstractCar newCar(){return null;}default AbstractPhone newPhone(){return null;}
}
生產(chǎn)手機的工廠分別為:
public class MyGamePhoneFactory implements MyAbstarctFactory{@Overridepublic AbstractPhone newPhone() {return new GamePhone();}
}
public class MyPhotoPhoneFactory implements MyAbstarctFactory{@Overridepublic AbstractPhone newPhone() {return new PhotoPhone();}
}
生產(chǎn)車的工廠分別為:
public class MyMiniCarFactory implements MyAbstarctFactory{@Overridepublic AbstractCar newCar() {return new MiniCar();}
}public class MyTruckCarFactory implements MyAbstarctFactory{@Overridepublic AbstractCar newCar() {return new Truck();}
}
測試類如下:
public class MyTest {public static void main(String[] args) {MyAbstarctFactory factory = new MyGamePhoneFactory();AbstractPhone abstractPhone = factory.newPhone();abstractPhone.run();factory = new MyMiniCarFactory();AbstractCar abstractCar = factory.newCar();abstractCar.run();}
}
運行如下:
可以看到,我們在擴展時,都是新增類,而不是修改原有的方法。