先直观对比一下抽象工厂模式(上图),与工厂方法模式(下图)的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 }

执行结果:

 

posted on 2019-12-28 11:03  Sempron2800+  阅读(233)  评论(0编辑  收藏  举报