深入理解C#设计模式的简单工厂模式、工厂方法模式和抽象工厂模式
- 简单工厂模式:
如果我们有一个逻辑,可能需要产生多种对象的时候,我们就将创建对象的过程放在工厂中,我们主程序 的逻辑却不需要修改。例如我们输入两个数以及一个操作符来进行运算。
class OperationSimpleFactory { static void Main(string[] args) { Operation oper; oper = OperationFactory.CreatOperation("*"); oper.NumberA = 10; oper.NumberB = 5; Console.WriteLine(oper.GetResult().ToString()); } } class Operation { private double _numberA;
<span class="token keyword">public</span> <span class="token keyword">double</span> NumberA <span class="token punctuation">{</span> <span class="token keyword">get</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> _numberA<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">set</span> <span class="token punctuation">{</span> _numberA <span class="token operator">=</span> <span class="token keyword">value</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">double</span> _numberB<span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">double</span> NumberB <span class="token punctuation">{</span> <span class="token keyword">get</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> _numberB<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">set</span> <span class="token punctuation">{</span> _numberB <span class="token operator">=</span> <span class="token keyword">value</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">virtual</span> <span class="token keyword">double</span> <span class="token function">GetResult</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">double</span> result <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">return</span> result<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">OpertionAdd</span> <span class="token punctuation">:</span> <span class="token class-name">Operation</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token keyword">double</span> <span class="token function">GetResult</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">double</span> result <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> result <span class="token operator">=</span> NumberA <span class="token operator">+</span> NumberB<span class="token punctuation">;</span> <span class="token keyword">return</span> result<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">OpertionSub</span> <span class="token punctuation">:</span> <span class="token class-name">Operation</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token keyword">double</span> <span class="token function">GetResult</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">double</span> result <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> result <span class="token operator">=</span> NumberA <span class="token operator">-</span> NumberB<span class="token punctuation">;</span> <span class="token keyword">return</span> result<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">OpertionMul</span> <span class="token punctuation">:</span> <span class="token class-name">Operation</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token keyword">double</span> <span class="token function">GetResult</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">double</span> result <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> result <span class="token operator">=</span> NumberA <span class="token operator">*</span> NumberB<span class="token punctuation">;</span> <span class="token keyword">return</span> result<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">OpertionDiv</span> <span class="token punctuation">:</span> <span class="token class-name">Operation</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token keyword">double</span> <span class="token function">GetResult</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">double</span> result <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>NumberB <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string">"除数不能为0"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> result <span class="token operator">=</span> NumberA <span class="token operator">/</span> NumberB<span class="token punctuation">;</span> <span class="token keyword">return</span> result<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">OperationFactory</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token class-name">Operation</span> <span class="token function">CreatOperation</span><span class="token punctuation">(</span><span class="token keyword">string</span> operate<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">Operation</span> oper <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span>operate<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> <span class="token string">"+"</span><span class="token punctuation">:</span> oper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OpertionAdd</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string">"-"</span><span class="token punctuation">:</span> oper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OpertionSub</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string">"*"</span><span class="token punctuation">:</span> oper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OpertionMul</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string">"/"</span><span class="token punctuation">:</span> oper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OpertionDiv</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">default</span><span class="token punctuation">:</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> oper<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
在其中的CreatOperation类中即是我们创建的简单工厂,都过输入运算类型及可返回相应的运算类。简单工厂依赖于运算类即可。即相当于一个工厂生产一个商品的基类,通过内部逻辑实现的子类。
简单工厂的应用场景:
当工厂类负责创建的对象比较少时可以考虑使用简单工厂模式()
客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时可以考虑使用简单工厂模式
2. 工厂方法
简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,如果我们想添加一个幂运算就需要修改工厂的静态方法。我们就将工厂抽象。
class Program { static void Main(string[] args) { OperationFactory addFactory = new AddFactory(); Operation ope = addFactory.create(); ope.NumberA = 10; ope.NumberB = 100; Console.WriteLine( ope.GetResult().ToString()); } } public class Operation { private double _numberA; public double NumberA { get { return _numberA; } set { _numberA = value; } } private double _numberB; public double NumberB { get { return _numberB; } set { _numberB = value; } } public virtual double GetResult() { double result = 0; return result; } } class OperationAdd : Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } class OperationSub : Operation { public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } } class OperationMulti : Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } class OperationDiv : Operation { public override double GetResult() { double result = 0; if (NumberB == 0) throw new Exception("除数不能为0"); result = NumberA / NumberB; return result; } } public abstract class OperationFactory { public abstract Operation create(); }
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">AddFactory</span> <span class="token punctuation">:</span> <span class="token class-name">OperationFactory</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token class-name">Operation</span> <span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">OperationAdd</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">SubFactory</span> <span class="token punctuation">:</span> <span class="token class-name">OperationFactory</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token class-name">Operation</span> <span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">OperationSub</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">MultiFactory</span> <span class="token punctuation">:</span> <span class="token class-name">OperationFactory</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token class-name">Operation</span> <span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">OperationMulti</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">DivFactory</span> <span class="token punctuation">:</span> <span class="token class-name">OperationFactory</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token class-name">Operation</span> <span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">OperationDiv</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
就相当于我将工厂抽象化,对应一个子类工厂实例化一个对象,那么就会有多上个对象就有多少个工厂类,此时如果我想添加一个幂数运算只需要添加一个幂数运算的工厂以及运算类即可。
工厂方法模式通过面向对象编程中的多态性来将对象的创建延迟到具体工厂中,从而解决了简单工厂模式中存在的问题,也很好地符合了开放封闭原则(即对扩展开发,对修改封闭)。
3. 抽象工厂模式
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用。一个程序里面一组的对象,比如说,在上面的运算类中,再添加一个菜 的产品;
class Program { static void Main(string[] args) { Factory factory = new AddFactory(); Operation ope = factory.OperCreate(); ope.NumberA = 10; ope.NumberB = 100; Console.WriteLine(ope.GetResult().ToString()); Food food = factory.FoodCreat(); food.Cook(); Console.WriteLine(food.Name); } } public class Operation { private double _numberA; public double NumberA { get { return _numberA; } set { _numberA = value; } } private double _numberB;
<span class="token keyword">public</span> <span class="token keyword">double</span> NumberB <span class="token punctuation">{</span> <span class="token keyword">get</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> _numberB<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">set</span> <span class="token punctuation">{</span> _numberB <span class="token operator">=</span> <span class="token keyword">value</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">virtual</span> <span class="token keyword">double</span> <span class="token function">GetResult</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">double</span> result <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">return</span> result<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name">Food</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token keyword">string</span> _name<span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">string</span> Name <span class="token punctuation">{</span> <span class="token keyword">get</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> _name<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">set</span> <span class="token punctuation">{</span> _name <span class="token operator">=</span> <span class="token keyword">value</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">abstract</span> <span class="token keyword">void</span> <span class="token function">Cook</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">KongpaoChicken</span> <span class="token punctuation">:</span> <span class="token class-name">Food</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token keyword">void</span> <span class="token function">Cook</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Name <span class="token operator">=</span> <span class="token string">"KongpaoChicken"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Manhanquanxi</span> <span class="token punctuation">:</span> <span class="token class-name">Food</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token keyword">void</span> <span class="token function">Cook</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Name <span class="token operator">=</span> <span class="token string">"Manhanquanxi"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">OperationAdd</span> <span class="token punctuation">:</span> <span class="token class-name">Operation</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token keyword">double</span> <span class="token function">GetResult</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">double</span> result <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> result <span class="token operator">=</span> NumberA <span class="token operator">+</span> NumberB<span class="token punctuation">;</span> <span class="token keyword">return</span> result<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name">OperationSub</span> <span class="token punctuation">:</span> <span class="token class-name">Operation</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token keyword">double</span> <span class="token function">GetResult</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">double</span> result <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> result <span class="token operator">=</span> NumberA <span class="token operator">-</span> NumberB<span class="token punctuation">;</span> <span class="token keyword">return</span> result<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name">Factory</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">abstract</span> <span class="token class-name">Operation</span> <span class="token function">OperCreate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">abstract</span> <span class="token class-name">Food</span> <span class="token function">FoodCreat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">AddFactory</span> <span class="token punctuation">:</span> <span class="token class-name">Factory</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token class-name">Operation</span> <span class="token function">OperCreate</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">OperationAdd</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token class-name">Food</span> <span class="token function">FoodCreat</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Manhanquanxi</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">SubFactory</span> <span class="token punctuation">:</span> <span class="token class-name">Factory</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token class-name">Operation</span> <span class="token function">OperCreate</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">OperationSub</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">override</span> <span class="token class-name">Food</span> <span class="token function">FoodCreat</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">KongpaoChicken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
通过工厂菜和运算类就紧密的联系了起来。
抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。
它与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。
</div><div><div></div></div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
</div>