一 介紹
工廠方法模式是5種創(chuàng)建性模型之一,屬于23種GOF設(shè)計(jì)模式之一,也是Java種最常用的設(shè)計(jì)模式之一,解決的是軟件設(shè)計(jì)中創(chuàng)建對象的問題。
二 定義
定義一個(gè)用于創(chuàng)建對象的接口,讓子類決定實(shí)例化哪一個(gè)類,工廠方法模式讓一個(gè)類的實(shí)例化延遲到了其子類。
模擬場景
現(xiàn)在模擬一個(gè)汽車的生產(chǎn)工廠,有兩個(gè)汽車生產(chǎn)工廠,分別生產(chǎn)Audi和Benz汽車,下面根據(jù)上面的UML圖實(shí)現(xiàn)兩種汽車的生產(chǎn)過程。

1 定義產(chǎn)品(汽車)的接口
public abstract class Product {
/**
* 產(chǎn)品類的抽象方法
* 由具體的產(chǎn)品類去實(shí)現(xiàn)
*/
public abstract void drive();
}
2 下面定義兩種品牌的汽車類的具體實(shí)現(xiàn)。
public class AudiProduct extends Product{
@Override
public void drive() {
System.out.println("Audi車行駛中...");
}
public class BenzProduct extends Product{
@Override
public void drive() {
System.out.println("Benz車行駛中...");
}
}
3 定義抽象工廠.
抽象工廠返回產(chǎn)品,具體返回什么產(chǎn)品要由具體的工廠實(shí)現(xiàn)決定。
public abstract class Factory {
/**
* 抽象工廠方法
* 具體生產(chǎn)什么由子類去實(shí)現(xiàn)
* @return
*/
public abstract Product creatProduct();
}
4 定義具體的工廠實(shí)現(xiàn)。
在具體的工廠實(shí)現(xiàn)里返回具體的產(chǎn)品。
public class AudiFactory extends Factory{
@Override
public Product creatProduct() {
return new AudiProduct();
}
}
public class BenzFactory extends Factory {
@Override
public Product creatProduct() {
return new BenzProduct();
}
}
5 客戶端實(shí)現(xiàn)
// Audi
Factory audiFactory = new AudiFactory(); // 工廠
Product audiProduct=audiFactory.creatProduct(); // 產(chǎn)品
audiProduct.drive();
// Benz
Factory benzFactory = new BenzFactory(); // 工廠
Product benzProduct=benzFactory.creatProduct(); // 產(chǎn)品
benzProduct.drive();
可以看到,和簡單工廠模式相比,簡單工廠產(chǎn)品類的實(shí)例化在一個(gè)統(tǒng)一工廠里實(shí)現(xiàn),統(tǒng)一工廠根據(jù)參數(shù)的不同實(shí)例化不同的產(chǎn)品類。而在工廠方法里,產(chǎn)品類的實(shí)例化推遲到了客戶端實(shí)現(xiàn)。
工廠方法模式總結(jié)如下:
優(yōu)點(diǎn):
1.更符合開閉原則,既擴(kuò)展開放,對修改關(guān)閉,對程序進(jìn)行擴(kuò)展時(shí),只需新增一項(xiàng)產(chǎn)品類,并實(shí)現(xiàn)對一個(gè)的工廠方法。(簡單工廠需要去修改工廠類,增加邏輯判斷)
2.符合單一職責(zé)原則
每一個(gè)產(chǎn)品工廠類只負(fù)責(zé)生產(chǎn)對象的產(chǎn)品。(簡單工廠模式只有一個(gè)生產(chǎn)產(chǎn)品的工廠)
缺點(diǎn):
1.每新增一個(gè)產(chǎn)品,都要增加一個(gè)產(chǎn)品類和對應(yīng)的生產(chǎn)工廠,會造成類的數(shù)目增加。
2.每一個(gè)工廠只負(fù)責(zé)生產(chǎn)對應(yīng)的產(chǎn)品,比較單一。