先直观对比一下抽象工厂模式(上图),与工厂方法模式(下图)的UML类图的区别。可以看出:
工厂方法模式是一个工厂接口,即多个工厂生产一种(等级)产品;
而抽象工厂模式是多个工厂接口,多个工厂生产多种(等级)产品。
抽象工厂模式(AbstractFactory)定义:提供一个称为抽象工厂的接口,其每一个实现类,可以创建一组(品牌)产品。无需知道被创建的产品的具体类型,就可以得到同品牌不同类型的产品。
举例来说:有一个抽象工厂接口,有两个厂家:HuaWei和Apple实现了这个接口。可以生产两种产品智能手机和平板电脑。
在使用抽象工厂模式后,可以分别得到:华为手机、华为平板、苹果手机、苹果平板,共4类具体的产品。
抽象工厂接口与实现类:
1 public interface AbstractFactory { 2 public Product1 newProduct1(); 3 public Product2 newProduct2(); 4 } 5 6 //华为 7 public class ConcreteFactory1 implements AbstractFactory { 8 //华为手机 9 @Override 10 public Product1 newProduct1() 11 { 12 System.out.println("华为品牌-->智能手机"); 13 return new ConcreteProduct11(); 14 } 15 //华为平板 16 @Override 17 public Product2 newProduct2() 18 { 19 System.out.println("华为品牌-->平板电脑"); 20 return new ConcreteProduct21(); 21 } 22 } 23 24 //苹果 25 public class ConcreteFactory2 implements AbstractFactory { 26 //苹果手机 27 @Override 28 public Product1 newProduct1() { 29 System.out.println("苹果品牌-->智能手机"); 30 return new ConcreteProduct12(); 31 } 32 33 //苹果平板 34 @Override 35 public Product2 newProduct2() { 36 System.out.println("苹果品牌-->平板电脑"); 37 return new ConcreteProduct22(); 38 } 39 }
抽象产品1与其实现类:
1 //手机 2 public abstract class Product1 { 3 4 } 5 6 //手机-华为生产 7 public class ConcreteProduct11 extends Product1 { 8 9 } 10 11 //手机-苹果生产 12 public class ConcreteProduct12 extends Product1 { 13 14 }
抽象产品2与其实现类:
1 //平板 2 public abstract class Product2 { 3 4 } 5 6 //平板-华为生产 7 public class ConcreteProduct21 extends Product2 { 8 9 } 10 11 //平板-苹果生产 12 public class ConcreteProduct22 extends Product2 { 13 14 }
调用方式:
1 public class Client { 2 public static void main(String[] args) { 3 //创建一个[苹果品牌 ->平板电脑]对象 4 AbstractFactory factory = new ConcreteFactory2(); 5 Product2 product = factory.newProduct2(); 6 } 7 }
执行结果: