在工廠方法模式中每一個(gè)具體工廠只需生產(chǎn)一種具體產(chǎn)品,但是在抽象工廠模式中一個(gè)具體工廠可以生產(chǎn)一組相關(guān)的具體產(chǎn)品。當(dāng)系統(tǒng)所提供的工廠生產(chǎn)的具體產(chǎn)品并不是一個(gè)簡(jiǎn)單的對(duì)象,而是多個(gè)位于不同產(chǎn)品等級(jí)結(jié)構(gòu),屬于不同類(lèi)型的具體產(chǎn)品時(shí)就可以使用抽象工廠模式。
抽象工廠模式為創(chuàng)建一組對(duì)象提供了一種解決方案。與工廠方法模式相比,抽象工廠模式中的具體工廠不只是創(chuàng)建一種產(chǎn)品,他負(fù)責(zé)創(chuàng)建一族產(chǎn)品。
定義:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口,而無(wú)須指定它們具體的類(lèi)。
抽象工廠模式結(jié)構(gòu)與實(shí)現(xiàn)
1.AbstractFactory(抽象工廠):聲明了一組用于創(chuàng)建一族產(chǎn)品的方法,每一個(gè)方法對(duì)應(yīng)一種產(chǎn)品。
public interface AbstractFactory {
public AbstractProductA createProductA();
public AbstractProductB createProductB();
//...
}
2.ConcreteFactory(具體工廠):實(shí)現(xiàn)了在抽象工廠中聲明的創(chuàng)建產(chǎn)品的方法,生成一組具體產(chǎn)品,這些產(chǎn)品構(gòu)成了一個(gè)產(chǎn)品族,每一個(gè)產(chǎn)品都位于某個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)中。
public class ConcreteFactory implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB();
}
}
3.AbstractProduct(抽象產(chǎn)品):為每一種產(chǎn)品聲明接口,在抽象產(chǎn)品中聲明了產(chǎn)品所有的業(yè)務(wù)方法。
public interface AbstractProductA {
public void applyProductA();
}
public interface AbstractProductB {
public void applyProductB();
}
4.ConcreteProduct(具體產(chǎn)品):定義了具體工廠生產(chǎn)的具體產(chǎn)品對(duì)象,實(shí)現(xiàn)了抽象產(chǎn)品接口中聲明的業(yè)務(wù)方法。
public class ConcreteProductA implements AbstractProductA {
@Override
public void applyProductA() {
System.out.println("應(yīng)用productA成功!");
}
}
public class ConcreteProductB implements AbstractProductB{
@Override
public void applyProductB() {
System.out.println("應(yīng)用productB成功!");
}
}
5.Test
public class Test {
public static void main(String[] args) {
AbstractFactory abstractFactory=new ConcreteFactory();
AbstractProductA productA=abstractFactory.createProductA();
productA.applyProductA();
AbstractProductB productB=abstractFactory.createProductB();
productB.applyProductB();
}
}