工廠模式實現了創建者和調用者分離。
工廠模式詳細分類可以有一下三種:
簡單工廠模式
工廠方法模式
抽象工廠模式
- 簡單工廠模式創建對象可以直接通過“工廠類”創建說需要的對象。
一個Car接口和兩個實現類
/**
* Car接口,帶有一個run方法
* @author 90948
*/
public interface Car {
void run();
}
public class Audi implements Car {
@Override
public void run() {
System.out.println("奧迪車");
}
}
public class BYD implements Car {
@Override
public void run() {
System.out.println("比亞迪車");
}
}
創建工廠類
/**
* Car工廠,創建Audi對象和BYD對象
* @author 90948
*/
public class CarFactory {
public static Car createCar(String name){
if("奧迪".equals(name)){
return new Audi();
}else if("比亞迪".equals(name)){
return new BYD();
}else{
return null;
}
}
}
測試類
public class Test {
public static void main(String[] args) {
Car c1 = CarFactory.createCar("奧迪");
Car c2 = CarFactory.createCar("比亞迪");
c1.run();
c2.run();
}
}
//結果:
//奧迪車
//比亞迪車
簡單工廠模式的缺點:不滿足面向對象的基本原則中的“開閉原則”,即開閉原則規定“軟件中的對象(類,模塊,函數等等)應該對於擴展是開放的,但是對於修改是封閉的。
- 工廠方法模式:
同樣用Car接口和兩個實現類
不同的是,創建一個CarFactory接口,並且有AudiFactory和BYDFactory實現類。
CarFactory接口
public interface CarFactory {
Car createCar();
}
實現類:
public class AudiFactory implements CarFactory {
@Override
public Car createCar() {
return new Audi();
}
}
public class BYDFactory implements CarFactory {
@Override
public Car createCar() {
return new BYD();
}
}
測試類:
public class Test {
public static void main(String[] args) {
Car c1 = new AudiFactory().createCar();
Car c2 = new BYDFactory().createCar();
c1.run();
c2.run();
}
}
//結果:
//奧迪車
//比亞迪車
優點:符合“開閉原則”。但是使項目的複雜度增加,即擴展是以增加新的類來實現的。
- 抽象工廠模式
用來生產不同產品族的全部產品,比如說:生產高端汽車需要高端的發動機,高端的座椅和高端的輪胎,生產低端的汽車需要低端的發動機,低端的座椅和低端的輪胎。代碼實現:
發動機接口以及其高低端發動機實現類:
/**
* 發動機接口
* @author 90948
*
*/
public interface Engine {
void run();//轉速
void strat();//啓動效率
}
/**
* 高端發動機
* @author 90948
*
*/
public class LuxuryEngine implements Engine {
@Override
public void run() {
System.out.println("轉速快!");
}
@Override
public void strat() {
System.out.println("啓動快!");
}
}
/**
* 低端發動機
* @author 90948
*/
public class LowerEngine implements Engine {
@Override
public void run() {
System.out.println("轉速慢!");
}
@Override
public void strat() {
System.out.println("啓動慢!");
}
}
座椅接口以及高低端座椅實現類
/**
* 座椅接口
* @author 90948
*/
public interface Seat {
void massage();//是否可以按摩
}
/**
* 高端座椅
* @author 90948
*/
public class LuxurySeat implements Seat {
@Override
public void massage() {
System.out.println("高端座椅,可以按摩!");
}
}
/**
* 低端座椅
* @author 90948
*/
public class LowerSeat implements Seat {
@Override
public void massage() {
System.out.println("低端座椅,不可以按摩!");
}
}
輪胎接口以及高低端輪胎實現類
/**
* 輪胎接口
* @author 90948
*/
public interface Tyre {
void revolve();//是否磨損
}
/**
* 高端輪胎
* @author 90948
*
*/
public class LuxuryTyre implements Tyre {
@Override
public void revolve() {
System.out.println("高端輪胎,不磨損!");
}
}
/**
* 低端輪胎
* @author 90948
*
*/
public class LowerTyre implements Tyre {
@Override
public void revolve() {
System.out.println("低端輪胎,質量差!");
}
}
製造汽車的工廠接口以及高低端汽車生產的實現類
/**
* 創建汽車的接口
* @author 90948
*
*/
public interface CarFactory {
Engine createEngine();//創建發動機
Seat createSeat();//創建座椅
Tyre createTyre();//創建輪胎
}
/**
* 製作高端汽車
* @author 90948
*
*/
public class LuxuryCar implements CarFactory{
@Override
public Engine createEngine() {
return new LuxuryEngine();
}
@Override
public Seat createSeat() {
return new LuxurySeat();
}
@Override
public Tyre createTyre() {
return new LuxuryTyre();
}
}
/**
* 製作低端汽車
* @author 90948
*
*/
public class LowerCar implements CarFactory{
@Override
public Engine createEngine() {
return new LowerEngine();
}
@Override
public Seat createSeat() {
return new LowerSeat();
}
@Override
public Tyre createTyre() {
return new LowerTyre();
}
}
測試類,生產一輛高端汽車:
/**
* 測試類,製作一輛高端汽車
* @author 90948
*/
public class Test {
public static void main(String[] args) {
CarFactory factory = new LuxuryCar();
Engine engine = factory.createEngine();
Seat seat = factory.createSeat();
Tyre tyre = factory.createTyre();
engine.run();
engine.strat();
seat.massage();
tyre.revolve();
}
}
//結果:
//轉速快!
//啓動快!
//高端座椅,可以按摩!
//高端輪胎,不磨損!
應用的場景主要有:
1. JDBC中Connection對象的獲取。
2. Hibernate中通過SessionFactory創建Session
3. Spring中IoC容器創建管理Bean。
等等……