工廠模式(二) 抽象工廠模式
定義 爲創建一組相關或者是相互依賴的對象提供一個接口。而不需要指定他們的具體類。
抽象工廠模式的類繁多分爲4類:
(1)抽象工廠角色 他聲明瞭一組用於創建一種產品的方法,每一個方法對應一種產品。
(2) 具體工廠角色 他實現了在抽象工廠中定義的創建產品的方法,生成一組具體產品這些產品構成一個產品種類
(3) 抽象產品角色 他爲每種產品聲明接口
(4) 具體產品角色 他定義具體工廠生產的具體產品對象實現抽象產品中聲明的業務方法
下面來一個抽象工廠模式的簡單實現
//先把抽象產品類寫出來
public interface IBrake {
void brake();
}
public interface IEngine {
void engine();
}
public interface ITire {
void tire();
}
//抽象工廠類
public abstract class CarFactory {
public abstract ITire creatTire();
public abstract IEngine createEngine();
public abstract IBrake createBrake();
}
//具體產品類 有點多
public class SUVTire implements ITire {
@Override
public void tire() {
System.out.println("我是SUV輪胎");
}
}
public class NormalTire implements ITire {
@Override
public void tire() {
System.out.println("我是正常輪胎");
}
}
public class SeniorBrake implements IBrake {
@Override
public void brake() {
System.out.println("高級制動");
}
}
public class NormalBrake implements IBrake {
@Override
public void brake() {
System.out.println("我是普通剎車系統");
}
}
public class DomestEngine implements IEngine {
@Override
public void engine() {
System.out.println("我是國產發動機");
}
}
public class ImportEngine implements IEngine {
@Override
public void engine() {
System.out.println("我是進口發動機");
}
}
//Q3工廠類
public class Q3Factory extends CarFactory {
@Override
public ITire creatTire() {
return new NormalTire();
}
@Override
public IEngine createEngine() {
return new DomestEngine();
}
@Override
public IBrake createBrake() {
return new NormalBrake();
}
}
//Q7工廠類
public class Q7Factory extends CarFactory {
@Override
public ITire creatTire() {
return new SUVTire();
}
@Override
public IEngine createEngine() {
return new ImportEngine();
}
@Override
public IBrake createBrake() {
return new SeniorBrake();
}
}
//客戶端實現
public class Client {
public static void main(String[] args){
CarFactory carQ3 = new Q3Factory();
carQ3.createBrake().brake();
carQ3.createEngine().engine();
carQ3.creatTire().tire();
CarFactory carQ7 = new Q7Factory();
carQ7.createBrake().brake();
carQ7.createEngine().engine();
carQ7.creatTire().tire();
}
}
代碼中可以看出來 Q3和Q7使用的零件是不相同的。
我們只是模擬了Q3Q7的生產工廠要是再加一個Q5呢 那麼我們對應的輪胎 發動機 剎車系統又要增加 這裏
可以看出抽象工廠模式的一個弊端,就是類的陡增,如果工廠類過多 勢必會導致文件非常多 多以在開發中一定要權衡利弊使用
總結一下
抽象工廠模式的優點:
一個顯著的優點是分離接口與實現。客戶端使用抽象工廠來創建需要的對象,而客戶端根本就不知道具體實現是誰
客戶端只是面向產品的接口編程而已,使其從具體的產品實現中解耦。同時基於接口與實現的分離,使用抽象工廠模式在切換
產品類時更加靈活、容易
抽象工廠模式的缺點:
上面我們也說了,一是對類文件的爆炸性增加,二是不太容易擴展新的產品類,因爲我們增加一個產品類就需要修改抽象工廠
那麼所有的具體工廠都要被修改。