Abstract Factory(DesignPattern)

Abstract Factory

目的

提供一个创建一系列相关对象的接口,无需为它们指定具体的类

动机

假设有一个支持多种风格的界面工具包,此时不应该为每一种特定风格的组件进行硬编码。因此我们可以定一个WidgetFactory的抽象类,提供返回窗口组件,门组件等接口。这样,用户程序就只用与抽象类定义的接口进行交互,而不用与具体的类进行交互。

适用范围

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

效果

  • 分离了具体的类:由factory去帮助你控制一个应用创建的对象的类;
  • 易于变换产品系列:只需要变换factory即可;
  • 有利于产品的一致性:当一个应用只使用一个factory提供的产品即可实现;
  • 难以支持新种类的产品(缺点):当扩展一个factory的新产品时,此时子类也必须全部发生变化;

源代码示范

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
// Abstract_Factory.cpp : 定义控制台应用程序的入口点。

#include <iostream>

class Product {
public:
virtual ~Product() { }
virtual void produce() = 0;

};

class DerivedproductA : public Product {
public:
void produce() {
std::cout << "Product produceA..." << std::endl;
}
};

class DerivedproductB : public Product {
public:
void produce() {
std::cout << "Product produceB..." << std::endl;
}
};

class AbstractFactory
{
public:

virtual ~AbstractFactory() {}
virtual Product* createproductA() = 0;
virtual Product* createproductB() = 0;
};

class ConcreteFactory : public AbstractFactory {
public:
Product* createproductA() {
return new DerivedproductA();
}

Product* createproductB() {
return new DerivedproductB();
}
};




int main()
{
AbstractFactory *factory = new ConcreteFactory();//virtual 具有封装功能
Product* productA = factory->createproductA();
Product* productB = factory->createproductB();
productA->produce();
productB->produce();

delete factory;
delete productA;
delete productB;
return 0;
}