**定義**:為創建一組相關或相互依賴的對象提供一個接口,而且無須指定他們的具體類。
我的理解:抽象工廠模式是工廠模式的升級,它針對多個業務品種,業務分類時通過抽象工廠模式來解決。
就好比工廠中的流水線工作一樣。
**一個例子**:
還是繼續女媧造人的故事,女媧在制造出白人、黑人、黃種人之后,又想創造出男人和女人。那么如何來解決這個需求呢?
**解決方案**:
1、定義一個接口Human,提供getSkin(),talk(),getSex()方法。
2、使用抽象類繼承自Human,分別實現不同膚色人的共有方法。
3、各種膚色的人擁有男性和女性類。
4、定義一個創建工廠接口,創建男性和女性工廠的類來實現不同種類的男性和女性的創建
工廠模式只要你知道創建工廠的類及方法,就能創造出一個與之無關的其他類,而不必去管它具體是怎么創建出來的。

~~~
public class HumanTest {
public static void main(String[] args) {
System.out.println("--------女性工廠-------------------");
FemaleYellowHuman femaleYellow = (FemaleYellowHuman) new FemaleFactory().createYellowHuman();
femaleYellow.getSex();
femaleYellow.getSkin();
femaleYellow.talk();
System.out.println("--------男性工廠---------------");
MaleYellowHuman maleYellow = (MaleYellowHuman) new MaleFactory().createYellowHuman();
maleYellow.getSex();
maleYellow.getSkin();
maleYellow.talk();
}
}
interface Human{
//獲取膚色
void getSkin();
//說話語言
void talk();
//性別
void getSex();
}
abstract class AbstractBlack implements Human{
public void getSkin(){
System.out.println("我是黑人,擁有黑色的皮膚...");
}
@Override
public void talk() {
System.out.println("我是黑人,說的是非洲語...");
}
}
abstract class AbstractYellow implements Human{
public void getSkin(){
System.out.println("我是黃種人,擁有黃色的皮膚...");
}
@Override
public void talk() {
System.out.println("我是黃種人,說的是漢語...");
}
}
abstract class AbstractWhite implements Human{
public void getSkin(){
System.out.println("我是白種人,擁有白色的皮膚...");
}
@Override
public void talk() {
System.out.println("我是白種人,說的是英語...");
}
}
class FemaleBlackHuman extends AbstractBlack{
@Override
public void getSex() {
System.out.println("我是非洲女人...");
}
}
class MaleBlackHuman extends AbstractBlack{
@Override
public void getSex() {
System.out.println("我是非洲男人...");
}
}
class FemaleYellowHuman extends AbstractYellow{
@Override
public void getSex() {
System.out.println("我是中國女人...");
}
}
class MaleYellowHuman extends AbstractYellow{
@Override
public void getSex() {
System.out.println("我是中國男人...");
}
}
class FemaleWhiteHuman extends AbstractWhite{
@Override
public void getSex() {
System.out.println("我是美國女人...");
}
}
class MaleWhiteHuman extends AbstractWhite{
@Override
public void getSex() {
System.out.println("我是美國男人...");
}
}
interface HumanFactory{
//創建黑人
Human createBlackHuman();
//創建黃種人
Human createYellowHuman();
//創建白人
Human createWhiteHuman();
}
class FemaleFactory implements HumanFactory{
@Override
public Human createBlackHuman() {
// TODO Auto-generated method stub
return new FemaleBlackHuman();
}
@Override
public Human createYellowHuman() {
// TODO Auto-generated method stub
return new FemaleYellowHuman();
}
@Override
public Human createWhiteHuman() {
// TODO Auto-generated method stub
return new FemaleWhiteHuman();
}
}
class MaleFactory implements HumanFactory{
@Override
public Human createBlackHuman() {
// TODO Auto-generated method stub
return new MaleBlackHuman();
}
@Override
public Human createYellowHuman() {
// TODO Auto-generated method stub
return new MaleYellowHuman();
}
@Override
public Human createWhiteHuman() {
// TODO Auto-generated method stub
return new MaleWhiteHuman();
}
}
~~~
**抽象類的通用模式**;
UML類圖:

說明:抽象工廠模式具有很好的封裝性,它的一般模式是:一個接口,多個抽象類,N個實現類。
他的產品族擴展比較困難,但是產品的等級易擴展。
~~~
public class AbstractFactoryTest {
public static void main(String[] args) {
System.out.println("---------等級1,的A,B兩個產品-------------");
IProduct c1 = new Creator1();
ProductA1 pa1 = (ProductA1) c1.createA();
ProductB1 pb1 = (ProductB1) c1.createB();
pa1.Method();
pb1.Method();
System.out.println("---------等級2,的A,B兩個產品-------------");
IProduct c2 = new Creator2();
ProductA2 pa2 = (ProductA2) c2.createA();
ProductB2 pb2 = (ProductB2) c2.createB();
pa2.Method();
pb2.Method();
}
}
interface IProduct{
AbstractProductA createA();
AbstractProductB createB();
}
abstract class AbstractProductA{
public void shareMethod(){
System.out.println("生產產品所共有的方法....");
}
//生產產品不同的方法
public abstract void Method();
}
abstract class AbstractProductB{
public void shareMethod(){
System.out.println("生產產品所共有的方法....");
}
//生產產品不同的方法
public abstract void Method();
}
class ProductA1 extends AbstractProductA{
@Override
public void Method() {
System.out.println("生產產品---A1---的方法 ....");
}
}
class ProductB1 extends AbstractProductB{
@Override
public void Method() {
System.out.println("生產產品---B1---的方法 ....");
}
}
class ProductA2 extends AbstractProductA{
@Override
public void Method() {
System.out.println("生產產品---A2---的方法 ....");
}
}
class ProductB2 extends AbstractProductB{
@Override
public void Method() {
System.out.println("生產產品---B2---的方法 ....");
}
}
class Creator1 implements IProduct{
//生產等級1產品A
@Override
public AbstractProductA createA() {
// TODO Auto-generated method stub
return new ProductA1();
}
//生產等級1產品B
@Override
public AbstractProductB createB() {
// TODO Auto-generated method stub
return new ProductB1();
}
}
class Creator2 implements IProduct{
//生產等級1產品A
@Override
public AbstractProductA createA() {
// TODO Auto-generated method stub
return new ProductA2();
}
//生產等級1產品B
@Override
public AbstractProductB createB() {
// TODO Auto-generated method stub
return new ProductB2();
}
}
~~~
- 前言
- 6大設計原則(一)---單一職責原則
- 6大設計原則(二)---里氏替換原則
- 6大設計原則(三)---依賴倒置原則
- 6大設計模式(四)----接口隔離原則
- 6大設計原則(五)---迪米特法則
- 6大設計原則(六)---開閉原則。
- 設計模式(一)---單例模式
- 設計模式(二)---工廠方法模式
- 設計模式(三)---抽象工廠模式
- 設計模式(四)---模板方法模式
- 設計模式(五)---建造者模式
- 設計模式(六)---代理模式
- 設計模式(七)---原型模式
- 設計模式(八)---中介者模式
- 設計模式(九)---命令模式
- 設計模式(十)---責任鏈模式
- 設計模式(十一)---裝飾模式
- 設計模式(十二)---策略模式
- 設計模式(十三)---適配器模式
- 設計模式(十四)---迭代器模式
- 設計模式(十五)---組合模式
- 設計模式(十六)---觀察者模式
- 設計模式(十七)---門面模式
- 設計模式(十八)---備忘錄模式
- 設計模式(十八)---訪問者模式
- 設計模式(二十)---狀態模式
- 設計模式(二十二)---享元模式
- 設計模式(二十三)---橋梁模式