抽象工廠模式介紹:
抽象工廠模式(Abstract Factory Pattern)起源于以前對不同操作系統(tǒng)的圖形化解決方案,如不同的操作系統(tǒng)中的按鈕和文件框控件其實現不同,展示效果也不一樣句葵,對于每個操作系統(tǒng),其本身就構成一個產品類兢仰,而按鈕和文本框控件也構成一個產品類乍丈,兩種產品類兩種變化,各自有各自的特點把将,如Android 中的Button 和TextView轻专,iOS中的Button 和 TextView,Windows Phone中的Button 和TextView等察蹲。
抽象工廠模式的定義:
為創(chuàng)建一組相關或是相互依賴的對象提供一個接口请垛,而不需要指定它們的具體類。
抽象工廠模式的UML類圖:
由UML圖可以得出如下抽象工廠模式的通用模式代碼洽议。
抽象產品類A
/**
* @ClassName AbstractProductA
* @Description 抽象產品類A
* @Author lm
* @Date 2018/9/13 0013 23:51
* @Version 1.0
**/
public abstract class AbstractProductA {
/**
* 每個具體的產品子類需要實現的方法
*/
public abstract void method();
}
抽象產品類B
/**
* @ClassName AbstractProductB
* @Description 抽象產品類B
* @Author lm
* @Date 2018/9/13 0013 23:53
* @Version 1.0
**/
public abstract class AbstractProductB {
/**
* 每個具體的產品子類需要實現的方法
*/
public abstract void method();
}
具體產品類A1
/**
* @ClassName ConcreteProductA1
* @Description 具體產品類A1
* @Author lm
* @Date 2018/9/13 0013 23:55
* @Version 1.0
**/
public class ConcreteProductA1 extends AbstractProductA {
@Override
public void method() {
System.out.println("具體產品A1的方法");
}
}
具體產品類A2
/**
* @ClassName ConcreteProductA2
* @Description 具體產品類A2
* @Author lm
* @Date 2018/9/13 0013 23:55
* @Version 1.0
**/
public class ConcreteProductA2 extends AbstractProductA {
@Override
public void method() {
System.out.println("具體產品A2的方法");
}
}
具體產品類B1
/**
* @ClassName ConcreteProductB1
* @Description 具體產品類B1
* @Author lm
* @Date 2018/9/13 0013 23:55
* @Version 1.0
**/
public class ConcreteProductB1 extends AbstractProductB {
@Override
public void method() {
System.out.println("具體產品B1的方法");
}
}
具體產品類B2
**
* @ClassName ConcreteProductB2
* @Description 具體產品類B2
* @Author lm
* @Date 2018/9/13 0013 23:55
* @Version 1.0
**/
public class ConcreteProductB2 extends AbstractProductB {
@Override
public void method() {
System.out.println("具體產品B2的方法");
}
}
抽象工廠類
/**
* @ClassName AbstractFactory
* @Description TODO
* @Author lm
* @Date 2018/9/14 0014 0:03
* @Version 1.0
**/
public abstract class AbstractFactory {
/**
* 創(chuàng)建產品A的方法
* return 產品A對象
*/
public abstract AbstractProductA createProductA();
/**
* 創(chuàng)建產品B的方法
* return 產品B對象
*/
public abstract AbstractProductB createProductB();
}
具體工廠類1
/**
* @ClassName ConcreteFactory1
* @Description 具體工廠類1
* @Author lm
* @Date 2018/9/14 0014 0:06
* @Version 1.0
**/
public class ConcreteFactory1 extends AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
具體工廠類2
/**
* @ClassName ConcreteFactory2
* @Description 具體工廠類2
* @Author lm
* @Date 2018/9/14 0014 0:06
* @Version 1.0
**/
public class ConcreteFactory2 extends AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}
抽象工廠模式的主要角色類:
【1】AbstractFactory:
抽象工廠角色宗收,它聲明了一組用于創(chuàng)建一種產品的方法,每一個方法對應一種產品亚兄,如上述類圖中的AbstractFactory中就定義了兩種方法混稽,分別創(chuàng)建產品A和產品B。
【2】ConcreteFactory:
具體工廠角色审胚,它實現了在抽象工廠中定義的創(chuàng)建產品的方法匈勋,生成一組具體產品,這些產品構成了一個產品種類膳叨,每一個產品都位于某個產品等級結構中洽洁,如上述類圖中的ConcreteFactory1和ConcreteFactory2。
【3】AbstractProduct:
抽象產品角色菲嘴,它為每種產品聲明接口饿自,比如上述類圖中的AbstractProductA和AbstractProductB碎浇。
【4】ConcreteProduct:
具體產品角色,它定義具體工廠生產的具體產品對象璃俗,實現抽象產品接口中聲明的業(yè)務方法奴璃,如上述類圖中的ConcreteProductA1、ConcreteProductA2城豁、ConcreteProductB1苟穆、ConcreteProductB2。
總結:
【1】抽象工廠方法模式的優(yōu)點:
一個顯著的優(yōu)點是分離接口與實現唱星,客戶端使用抽象工廠來創(chuàng)建需要的對象雳旅,而客戶端根本就不知道具體的實現是誰,客戶端只是面向產品的接口編程而已间聊,使其從具體的產品實現中解耦攒盈,同時基于接口與實現的分離,使抽象該工廠方法模式在切換產品類時更加靈活哎榴,容易型豁。
【2】抽象工廠方法模式的缺點:
一是類文件的爆炸性增加,二是不太容易擴展新的產品類尚蝌,因為每當增加一個產品類就需要修改抽象工廠迎变,那么所有的具體工廠類均會被修改。