首页 > 代码库 > 抽象工厂模式<Abstract Factory>

抽象工厂模式<Abstract Factory>

概述

  提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.让子类决定实例化哪一个类

角色

  抽象工厂(Creator):这个抽象类(或接口)声明一个创建对象的工厂方法,用来返回一个Product类型的对象。

  具体工厂(ConcreteCreator):重定义工厂方法,返回一个具体的Concrete Product实例。

  抽象产品(Product):定义工厂方法所创建的对象

  具体产品(ConcreteProduct): 具体产品,继承自Product抽象类。

解读

  UML图 

   c#代码

   

 1     /// <summary>
 2     /// 产品抽象类
 3     /// </summary>
 4     public abstract class Product
 5     {
 6         public string Name
 7         {
 8             get;
 9             set;
10         }
11     }
12 
13 
14     /// <summary>
15     /// 具体的产品类
16     /// </summary>
17     public class ConcreteProductA:Product
18     {
19         public ConcreteProductA ()
20         {
21             Name = "A";
22         }
23     }
24 
25     public class ConcreteProductB : Product
26     {
27         public ConcreteProductB ()
28         {
29             Name = "B";
30         }
31     }
32 
33 
34     /// <summary>
35     /// 抽象工厂类
36     /// </summary>
37     public interface Creator
38     {
39         Product Create ();
40     }
41     
42     ///具体工厂类,每一个类对应生成一个产品
43     public sealed class ProductACreator:Creator
44     {
45         public Product Create ()
46         {
47             return new ConcreteProductA ();
48         }
49     }
50 
51     public sealed class ProductBCreator : Creator
52     {
53         public Product Create ()
54         {
55             return new ConcreteProductB ();
56         }
57     }
View Code

总结

  优点:

    工厂方法去除了条件分支(解除了工厂类与分支的耦合),解决了简单工厂对修改开放的问题<OCP>。

  缺点:

    工厂方法模式实现时,客户端需要决定实例化哪个工厂来实现对具体产品的构建,选择判断依然存在,也就是说,工厂方法模式将简单工厂的逻辑判断交给客户端去处理。

    对简单工厂模式来说,增加功能是要修改工厂类的;但对工厂方法模式,修改的是客户端。

  使用场景:

    对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
    子类的数量不固定,随时可能有新的功能子类出现

随笔

  具体工厂类需要随着具体类的增加而增加,且数量应该是一致的!