工廠模式:用來實例化有共同接口的類,應用工廠模式能夠動態決定實例化哪個類html
工廠模式的分類:ide
一、簡單工廠模式(Simple Factory)測試
二、工廠方法模式(Factory Method)ui
三、抽象工廠模式(Abstruct Factory)spa
(本文只介紹抽象工廠模式,想了解簡單工廠模式與工廠方法模式請到http://www.cnblogs.com/Not-Famous/p/3648535.html).net
另外,本文轉自http://blog.csdn.net/liruikqn/article/details/12888511,本人根據我的理解,稍有刪改。翻譯
抽象工廠模式(Abstract Factory)是工廠方法模式的進一步抽象,其英文原話"Provide an interface for creating families of related or dependent objects without specifying their concrete classes",翻譯,「爲建立一組相關或相互依賴的對象提供一個接口,無需指定它們的具體類」。抽象工廠模式一般是用於創一族產品,而且這族產品分不一樣的等級;不一樣的具體工廠類生產不一樣等級的一族產品。抽象工廠模式也有四種角色:抽象工廠、具體工廠、抽象產品和具體產品。抽象工廠模式的類圖以下:code
能夠看到產品族包括ProductA和ProductB兩種產品,每一個具體工廠都能生產這兩種產品,只是ConcreteFactory1生產的等級爲1的族產品;ConcreteFactory2生產的是等級爲2的族產品。下面以上圖爲模型,寫一個demo,測試抽象工廠模式。htm
1.定義抽象工廠接口對象
1 //抽象工廠,定義了生產族產品的方法; 2 public interface AbstractFactory { 3 public ProductA factoryA(); 4 public ProductB factoryB(); 5 }
2.定義產品A接口
1 //抽象產品A定義了產品的公共方法,產品A和B屬於一個產品族 2 public interface ProductA { 3 public void method1(); 4 public void method2(); 5 }
3.定義產品B接口
1 //抽象產品A定義了產品的公共方法,產品A和B屬於一個產品族 2 public interface ProductA { 3 public void method1(); 4 public void method2(); 5 }
4.定義生產等級爲1的族產品的具體工廠的類
1 //ConcreateFactory1是用來生產等級爲1的產品A,B; 2 public class ConcreateFactory1 implements AbstractFactory { 3 4 //生產等級爲1的產品A 5 @Override 6 public ProductA factoryA() { 7 // TODO Auto-generated method stub 8 return new ConcreateProductA1(); 9 } 10 11 12 //生產等級爲1的產品B 13 @Override 14 public ProductB factoryB() { 15 // TODO Auto-generated method stub 16 return new ConcreateProductB1(); 17 } 18 19 }
5.定義生產等級爲2的族產品的具體工廠的類
1 //ConcreateFactory2是用來生產等級爲1的產品A,B; 2 public class ConcreateFactory2 implements AbstractFactory { 3 4 //生產等級爲2的產品A 5 @Override 6 public ProductA factoryA() { 7 // TODO Auto-generated method stub 8 return new ConcreateProductA2(); 9 } 10 11 12 //生產等級爲2的產品B 13 @Override 14 public ProductB factoryB() { 15 // TODO Auto-generated method stub 16 return new ConcreateProductB2(); 17 } 18 19 }
6.定義等級爲1的產品A(具體產品)的類
//等級爲1的具體產品A public class ConcreateProductA1 implements ProductA { @Override public void method1() { // TODO Auto-generated method stub System.out.println("等級爲1的產品A的method1()"); } @Override public void method2() { // TODO Auto-generated method stub System.out.println("等級爲1的產品A的method2()"); } }
7.定義等級爲2的產品A(具體產品)的類
1 //等級爲2的具體產品A 2 public class ConcreateProductA2 implements ProductA { 3 4 @Override 5 public void method1() { 6 // TODO Auto-generated method stub 7 System.out.println("等級爲2的產品A的method1()"); 8 } 9 10 @Override 11 public void method2() { 12 // TODO Auto-generated method stub 13 System.out.println("等級爲2的產品A的method2()"); 14 } 15 }
8.定義等級爲1的產品B(具體產品)的類
1 //等級爲1的產品B 2 public class ConcreateProductB1 implements ProductB{ 3 4 @Override 5 public void method1() { 6 // TODO Auto-generated method stub 7 System.out.println("等級爲1的產品B的method1()"); 8 } 9 10 @Override 11 public void method2() { 12 // TODO Auto-generated method stub 13 System.out.println("等級爲1的產品B的method2()"); 14 } 15 }
9.定義等級爲2的產品B(具體產品)的類
1 //等級爲2的產品B 2 public class ConcreateProductB2 implements ProductB { 3 4 @Override 5 public void method1() { 6 // TODO Auto-generated method stub 7 System.out.println("等級爲2的產品B的method1()"); 8 } 9 10 @Override 11 public void method2() { 12 // TODO Auto-generated method stub 13 System.out.println("等級爲2的產品B的method2()"); 14 } 15 }
由此可知,抽象工廠模式相對於工廠方法模式來講,每一個具體工廠能夠生產一族產品(即多種產品);而工廠方法模式是具體工廠生產相應的具體產品,只能生產一種產品。當產品族中只有一種產品時抽象工廠模式退化成工廠方法模式。
以上即是抽象工廠模式的內容,層次會比較複雜,建議讀者結合代碼和類圖來理解!