设计模式之美:Abstract Factory(抽象工厂)

简介:

索引

别名

  • Kit

意图

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

结构

参与者

AbstractFactory

  • 声明一个创建抽象产品对象的操作接口。

ConcreteFactory

  • 实现创建具体产品对象的操作。

AbstractProduct

  • 为一类产品对象声明一个接口。

ConcreteProduct

  • 定义一个将被相应的具体工厂创建的产品对象。
  • 实现 AbstractProduct 接口。

Client

  • 仅适用由 AbstractFactory 和 AbstractProduct 类声明的接口。

适用性

在以下情况下可以使用 Abstract Factory 模式:

  • 一个系统要独立于它的产品的创建、组合和表示时。
  • 一个系统要由多个产品系列中的一个来配置时。
  • 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
  • 当你提供一个产品类库,而只想显示它们的接口而不是实现时。

缺点

  • 难以支持新种类的产品。支持新种类的产品就需要扩展 AbstractFactory 接口,这将引起所有子类的改变。

效果

  • 它分离了具体的类。
  • 它使得易于交换产品系列。
  • 它有利于产品的一致性。

相关模式

命名约定

使用命名约定是一个好习惯,例如,总是声明那些定义为抽象工厂的类为 XxxKit。

实现

实现方式(一):使用 Factory Method 来实现 Abstract Factory。

一个具体的工厂将为每个产品重定义该工厂方法以指定产品。

复制代码
 1 namespace AbstractFactoryPattern.Implementation1
 2 {
 3   public abstract class AbstractOrInterfaceOfFactoryKit
 4   {
 5     public abstract AbstractOrInterfaceOfProductA CreateProductA();
 6     public abstract AbstractOrInterfaceOfProductB CreateProductB();
 7   }
 8 
 9   public abstract class AbstractOrInterfaceOfProductA
10   {
11   }
12 
13   public abstract class AbstractOrInterfaceOfProductB
14   {
15   }
16 
17   public class ConcreteFactoryKit1 : AbstractOrInterfaceOfFactoryKit
18   {
19     public override AbstractOrInterfaceOfProductA CreateProductA()
20     {
21       return new ConcreteProductA();
22     }
23 
24     public override AbstractOrInterfaceOfProductB CreateProductB()
25     {
26       return new ConcreteProductB();
27     }
28   }
29 
30   public class ConcreteProductA : AbstractOrInterfaceOfProductA
31   {
32   }
33 
34   public class ConcreteProductB : AbstractOrInterfaceOfProductB
35   {
36   }
37 
38   public class Client
39   {
40     public void TestCase1()
41     {
42       AbstractOrInterfaceOfFactoryKit kit = new ConcreteFactoryKit1();
43       AbstractOrInterfaceOfProductA productA = kit.CreateProductA();
44       AbstractOrInterfaceOfProductB productB = kit.CreateProductB();
45     }
46   }
47 }
复制代码

实现方式(二):使用 Prototype 来实现 Abstract Factory。

具体工厂使用产品系列中每一个产品的原型实例来初始化,且它通过复制它的原型来创建新的产品。

复制代码
 1 namespace AbstractFactoryPattern.Implementation2
 2 {
 3   public abstract class AbstractOrInterfaceOfFactoryKit
 4   {
 5     public abstract AbstractOrInterfaceOfProductA CreateProductA();
 6     public abstract AbstractOrInterfaceOfProductB CreateProductB();
 7   }
 8 
 9   public abstract class AbstractOrInterfaceOfProductA
10   {
11     public abstract AbstractOrInterfaceOfProductA Clone();
12   }
13 
14   public abstract class AbstractOrInterfaceOfProductB
15   {
16     public abstract AbstractOrInterfaceOfProductB Clone();
17   }
18 
19   public class ConcreteFactoryKit1 : AbstractOrInterfaceOfFactoryKit
20   {
21     public override AbstractOrInterfaceOfProductA CreateProductA()
22     {
23       return new ConcreteProductA();
24     }
25 
26     public override AbstractOrInterfaceOfProductB CreateProductB()
27     {
28       return new ConcreteProductB();
29     }
30   }
31 
32   public class ConcreteFactoryKit2 : AbstractOrInterfaceOfFactoryKit
33   {
34     private AbstractOrInterfaceOfProductA _prototypeOfProductA;
35     private AbstractOrInterfaceOfProductB _prototypeOfProductB;
36 
37     public ConcreteFactoryKit2(
38       AbstractOrInterfaceOfProductA prototypeOfProductA,
39       AbstractOrInterfaceOfProductB prototypeOfProductB)
40     {
41       _prototypeOfProductA = prototypeOfProductA;
42       _prototypeOfProductB = prototypeOfProductB;
43     }
44 
45     public override AbstractOrInterfaceOfProductA CreateProductA()
46     {
47       return _prototypeOfProductA.Clone();
48     }
49 
50     public override AbstractOrInterfaceOfProductB CreateProductB()
51     {
52       return _prototypeOfProductB.Clone();
53     }
54   }
55 
56   public class ConcreteProductA : AbstractOrInterfaceOfProductA
57   {
58     public override AbstractOrInterfaceOfProductA Clone()
59     {
60       return new ConcreteProductA();
61     }
62   }
63 
64   public class ConcreteProductB : AbstractOrInterfaceOfProductB
65   {
66     public override AbstractOrInterfaceOfProductB Clone()
67     {
68       return new ConcreteProductB();
69     }
70   }
71 
72   public class Client
73   {
74     public void TestCase2()
75     {
76       AbstractOrInterfaceOfFactoryKit kit1 = new ConcreteFactoryKit1();
77       AbstractOrInterfaceOfProductA productA1 = kit1.CreateProductA();
78       AbstractOrInterfaceOfProductB productB1 = kit1.CreateProductB();
79 
80       AbstractOrInterfaceOfFactoryKit kit2 = new ConcreteFactoryKit2(productA1, productB1);
81       AbstractOrInterfaceOfProductA productA2 = kit2.CreateProductA();
82       AbstractOrInterfaceOfProductB productB2 = kit2.CreateProductB();
83     }
84   }
85 }
复制代码

实现方式(三):定义可扩展的 Abstract Factory

Abstract Factory 通常为每一种它可以生产的产品定义一个操作。产品的种类被编码在操作型构中。

增加一种新的产品要求改变 Abstract Factory 的接口以及所有与它相关的类。

一个更灵活但不太安全的设计是给创建对象的操作增加一个参数。该参数指定了将被创建的对象的种类。

该参数可以是一个类标识符、一个整数、一个字符串,或其他任何可以标识这种产品的东西。

这样改动之后,Abstract Factory 只需要一个 "Make" 操作和一个指示要创建对象的种类的参数。

复制代码
 1 namespace AbstractFactoryPattern.Implementation3
 2 {
 3   public enum ProductCategory
 4   {
 5     ProductA,
 6     ProductB,
 7   }
 8 
 9   public abstract class AbstractOrInterfaceOfFactoryKit
10   {
11     public abstract object CreateProduct(ProductCategory category);
12   }
13 
14   public abstract class AbstractOrInterfaceOfProductA
15   {
16   }
17 
18   public abstract class AbstractOrInterfaceOfProductB
19   {
20   }
21 
22   public class ConcreteFactoryKit1 : AbstractOrInterfaceOfFactoryKit
23   {
24     public override object CreateProduct(ProductCategory category)
25     {
26       switch (category)
27       {
28         case ProductCategory.ProductA:
29           return new ConcreteProductA();
30         case ProductCategory.ProductB:
31           return new ConcreteProductB();
32         default:
33           throw new NotSupportedException();
34       }
35     }
36   }
37 
38   public class ConcreteProductA : AbstractOrInterfaceOfProductA
39   {
40   }
41 
42   public class ConcreteProductB : AbstractOrInterfaceOfProductB
43   {
44   }
45 
46   public class Client
47   {
48     public void TestCase3()
49     {
50       AbstractOrInterfaceOfFactoryKit kit = new ConcreteFactoryKit1();
51       AbstractOrInterfaceOfProductA productA = (AbstractOrInterfaceOfProductA)kit.CreateProduct(ProductCategory.ProductA);
52       AbstractOrInterfaceOfProductB productB = (AbstractOrInterfaceOfProductB)kit.CreateProduct(ProductCategory.ProductB);
53     }
54   }
55 }
复制代码

实现方式(四):使用模板以避免创建子类。

使用C#中的泛型实现抽象工厂。

复制代码
 1 namespace AbstractFactoryPattern.Implementation4
 2 {
 3   public abstract class AbstractOrInterfaceOfFactoryKit
 4   {
 5     public abstract AbstractOrInterfaceOfProductA CreateProductA();
 6     public abstract AbstractOrInterfaceOfProductB CreateProductB();
 7     public abstract AbstractOrInterfaceOfProductC CreateProductC<TC>()
 8       where TC : AbstractOrInterfaceOfProductC, new();
 9   }
10 
11   public abstract class AbstractOrInterfaceOfProductA
12   {
13   }
14 
15   public abstract class AbstractOrInterfaceOfProductB
16   {
17   }
18 
19   public abstract class AbstractOrInterfaceOfProductC
20   {
21   }
22 
23   public class ConcreteFactoryKit1<TA, TB> : AbstractOrInterfaceOfFactoryKit
24     where TA : AbstractOrInterfaceOfProductA, new()
25     where TB : AbstractOrInterfaceOfProductB, new()
26   {
27     public override AbstractOrInterfaceOfProductA CreateProductA()
28     {
29       return new TA();
30     }
31 
32     public override AbstractOrInterfaceOfProductB CreateProductB()
33     {
34       return new TB();
35     }
36 
37     public override AbstractOrInterfaceOfProductC CreateProductC<TC>()
38     {
39       return new TC();
40     }
41   }
42 
43   public class ConcreteProductA : AbstractOrInterfaceOfProductA
44   {
45   }
46 
47   public class ConcreteProductB : AbstractOrInterfaceOfProductB
48   {
49   }
50 
51   public class ConcreteProductC : AbstractOrInterfaceOfProductC
52   {
53   }
54 
55   public class Client
56   {
57     public void TestCase4()
58     {
59       AbstractOrInterfaceOfFactoryKit kit = new ConcreteFactoryKit1<ConcreteProductA, ConcreteProductB>();
60       AbstractOrInterfaceOfProductA productA = kit.CreateProductA();
61       AbstractOrInterfaceOfProductB productB = kit.CreateProductB();
62       AbstractOrInterfaceOfProductC productC = kit.CreateProductC<ConcreteProductC>();
63     }
64   }
65 }
复制代码
目录
相关文章
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
448 16
|
设计模式 Java 关系型数据库
【设计模式】【创建型模式】抽象工厂模式(Abstract Factory)
一、入门 什么是抽象工厂模式? 抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。 简单来说,抽象工厂模式是工厂方法模式的升级版,它能够创建一组相
499 14
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
设计模式 Java 关系型数据库
设计模式:工厂方法模式(Factory Method)
工厂方法模式是一种创建型设计模式,通过将对象的创建延迟到子类实现解耦。其核心是抽象工厂声明工厂方法返回抽象产品,具体工厂重写该方法返回具体产品实例。适用于动态扩展产品类型、复杂创建逻辑和框架设计等场景,如日志记录器、数据库连接池等。优点包括符合开闭原则、解耦客户端与具体产品;缺点是可能增加类数量和复杂度。典型应用如Java集合框架、Spring BeanFactory等。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
275 3
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
|
设计模式
设计模式之工厂 Factory
设计模式之工厂 Factory
311 1
|
设计模式 Java
设计模式-抽象工厂(JAVA)
设计模式-抽象工厂(JAVA)
124 0
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
464 0

热门文章

最新文章