設計模式_工廠模式
阿新 • • 發佈:2019-04-08
就會 factory 抽象工廠模式 只需要 strong tor sys 破壞 oid 特性來解決這個問題。
模式:創建型模式
? 普通的工廠模式
優點:編寫簡單,清晰
缺點:當工廠需要生產多一個車型,那就需要更改“工廠類”的代碼,這樣對開閉原則不好。
/**
* 車的接口
* */
public interface Car {
public void drive();
}
/**
* 奔馳
* */
class Benz implements Car{
@Override
public void drive() {
System.out.println("Benz");
}
}
/** * 寶馬 * */ class BMW implements Car{ @Override public void drive() { System.out.println("BMW"); } }
class CarFactory {
public Car productCar(String car) {
if ("Benz".equals(car)) {
return new Benz();
} else if("BMW".equals(car)) {
return new BMW();
}
return null;
}
}
? 工廠方法模式
優點:解決了“普通工廠方法”中破壞的開閉原則。為了阻止“增加一個牌子就需要改一下工廠源碼”,我們決定換個思路來解決這個問題-“增加類”。當需要增加一個牌子的時候,我們就相應增加一個工廠類。利用 Java 多態
我們繼續使用上面的代碼作為這個欄目的示例。
/**
* 比亞迪
* */
class BYD implements Car{
@Override
public void drive() {
System.out.println("BYD");
}
}
我們將相關的車輛抽象成一個工廠
/**
* 工廠接口
* */
interface Factory {
void product() ;
}
然後生成一個"比亞迪"的工廠
/** * 比亞迪 - 工廠 * */ class BYDFactory implements Factory { @Override public BYD product() { return new BYD(); } }
然後當我們想生產一個比亞迪的車輛,我們只需要這麽寫
class Test {
public static void main(String[] args) {
Factory factory = new BYDFactory();
factory.product();
}
}
同理,若我們再向增加多一個車輛的牌子生產,我們只需要遵循以下步驟
- 增加相關的汽車類,實現 C調用其
product
方法即可。
ar 接口 - 增加相關汽車類的工廠,實現 Factory
- 通過實例化新增的汽車類的工廠類,
這樣做的好處是,當我們新增的類的時候,不需要更改源碼,只需要增加相關的類。
但是這個模式還是不夠完美。比如說,我想要一個 beaz 牌子的輪胎,我就加一個 beaz 的相關類及工廠類;我想要一個 beaz 牌子的輪胎,我就加一個 BYD 的相關類及工廠類...
太可怕了。這樣子加的類只會越來越多。
那該怎麽辦?
或許有人已經註意到了,其實無論是輪胎還是後視鏡,只要你想要的是 beaz 這個牌子的產品,那麽我們可以以牌子為維度來抽象。所以不僅僅是產品(如 beaz 輪胎)可以抽象,其實工廠也可以抽象!下面將講解對工廠的抽象。
? 抽象工廠模式
既然 beaz 不僅僅生產汽車,它還生產方向盤,雨刷,輪胎等等。所以我們可以認為抽象出一個工廠接口,定義好這個
這類抽象的方法。
public interface CarFactory {
void createCar();
Screen createScreen();
AimingCircle createAimingCircle();
}
/**
* 屏幕抽象
* */
interface Screen {
}
/** 方向盤接口 */
interface AimingCircle {
}
/** 奔馳屏幕實現 */
class BenzScreen implements Screen {
}
/** 奔馳方向盤實現 */
class BenzAimingCircle implements AimingCircle {
}
/** 比亞迪屏幕實現 */
class BYDScreen implements Screen {
}
/** 比亞迪方向盤實現 */
class BYDAimingCircle implements AimingCircle {
}
/** 奔馳 一系列工廠 */
class BenzFactory implements CarFactory {
@Override
public void createCar() {
System.out.println("創建一輛奔馳車");
}
@Override
public Screen createScreen() {
return new BenzScreen();
}
@Override
public AimingCircle createAimingCircle() {
return new BenzAimingCircle();
}
}
/** BYD 一系列工廠 */
class BYDFactory implements CarFactory {
@Override
public void createCar() {
System.out.println("創建一輛奔馳車");
}
@Override
public Screen createScreen() {
return new BYDScreen();
}
@Override
public AimingCircle createAimingCircle() {
return new BYDAimingCircle();
}
}
其實細心一點的同學就會發現,其實工廠和抽象工廠之間的不同之處在於,工廠的抽象維度在於產品,一個工廠只能生產一個產品;而抽象工廠的抽象維度在於工廠,這個工廠是可以生產多系列的產品。
設計模式_工廠模式