模式意图

  提供对象的使用接口,隐藏对象的创建过程。

模式结构

【设计模式】——抽象工厂Abstract Factory

AbstractFactory 提供创建对象的接口。

ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。

AbstractProduct 提供对象的使用接口。

ConcreteProduct 提供真正的适用对象,隐藏该对象的创建过程,是工厂创建的对象。

Client 使用者,通过抽象工厂接口,使用不同的具体工厂方法创建对象组合,从而直接使用对象,无需关注对象的创建过程。

 

适合场景

  1 系统独立于它的产品创建、组合和表示。即无需关心内部对象时如何创建的,怎么创建的,什么含义。

  2 系统需要多个产品组合中的一个配置。由于对象很多,能够组合出的组合非常多,而系统只是使用某一个组合。

  3 强调的对象的组合结果,而不是他们具体的接口和实现。

 

代码结构

  AbstractFactory.java

interface AbstractFactory {
    public AbstractProductA CreateProductA();
    public AbstractProductB CreateProductB();
}

  ConcreteFactory.java

class ConcreteFactory1 implements AbstractFactory{

    @Override
    public AbstractProductA CreateProductA() {
        return new ConcreteProductA1();
    }

    @Override
    public AbstractProductB CreateProductB() {
        return new ConcreteProductB1();
    }

}

  AbstractProduct.java

interface AbstractProductA {
    public void use();
}
interface AbstractProductB {
    public void use();
}

  ConcreteProduct.java

class ConcreteProductA1 implements AbstractProductA{

    @Override
    public void use() {
        // TODO Auto-generated method stub
        System.out.println("use A1 product!");
    }

}
class ConcreteProductB1 implements AbstractProductB{

    @Override
    public void use() {
        // TODO Auto-generated method stub
        System.out.println("use B1 product!");
    }

}

  使用方式

    public static void main(String[] args){
        AbstractProductA pa;
        AbstractProductB pb;
        
        AbstractFactory fa1 = new ConcreteFactory1();
        pa = fa1.CreateProductA();
        pb = fa1.CreateProductB();
        pa.use();
        pb.use();
        
        AbstractFactory fa2 = new ConcreteFactory2();
        pa = fa2.CreateProductA();
        pb = fa2.CreateProductB();
        pa.use();
        pb.use();
        
    }

  全部代码

 1 package com.designer;
 2 interface AbstractFactory {
 3     public AbstractProductA CreateProductA();
 4     public AbstractProductB CreateProductB();
 5 }
 6 interface AbstractProductA {
 7     public void use();
 8 }
 9 interface AbstractProductB {
10     public void use();
11 }
12 class ConcreteFactory1 implements AbstractFactory{
13 
14     @Override
15     public AbstractProductA CreateProductA() {
16         return new ConcreteProductA1();
17     }
18 
19     @Override
20     public AbstractProductB CreateProductB() {
21         return new ConcreteProductB1();
22     }
23 
24 }
25 class ConcreteFactory2 implements AbstractFactory{
26 
27     @Override
28     public AbstractProductA CreateProductA() {
29         return new ConcreteProductA2();
30     }
31 
32     @Override
33     public AbstractProductB CreateProductB() {
34         return new ConcreteProductB2();
35     }
36 
37 }
38 class ConcreteProductA1 implements AbstractProductA{
39 
40     @Override
41     public void use() {
42         // TODO Auto-generated method stub
43         System.out.println("use A1 product!");
44     }
45 
46 }
47 class ConcreteProductA2 implements AbstractProductA{
48 
49     @Override
50     public void use() {
51         // TODO Auto-generated method stub
52         System.out.println("use A2 product!");
53     }
54 
55 }
56 class ConcreteProductB1 implements AbstractProductB{
57 
58     @Override
59     public void use() {
60         // TODO Auto-generated method stub
61         System.out.println("use B1 product!");
62     }
63 
64 }
65 class ConcreteProductB2 implements AbstractProductB{
66 
67     @Override
68     public void use() {
69         // TODO Auto-generated method stub
70         System.out.println("use B2 product!");
71     }
72 
73 }
74 public class Client {
75     public static void main(String[] args){
76         AbstractProductA pa;
77         AbstractProductB pb;
78         
79         AbstractFactory fa1 = new ConcreteFactory1();
80         pa = fa1.CreateProductA();
81         pb = fa1.CreateProductB();
82         pa.use();
83         pb.use();
84         
85         AbstractFactory fa2 = new ConcreteFactory2();
86         pa = fa2.CreateProductA();
87         pb = fa2.CreateProductB();
88         pa.use();
89         pb.use();
90         
91     }
92 }
View Code

相关文章:

  • 2021-07-09
  • 2022-01-06
  • 2021-11-03
  • 2022-02-26
  • 2021-11-06
  • 2022-12-23
  • 2021-12-04
猜你喜欢
  • 2021-06-10
  • 2021-12-16
  • 2021-11-12
相关资源
相似解决方案