Abstract Factory 抽象工厂模式

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

抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具体实现,创建一组具体的对象。

以下情况可以使用抽象工厂模式:

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

抽象工厂模式的优缺点:

  • 他分离了具体的类
  • 它使得易于交换产品系列
  • 它有利于产品的一致性
  • 难以支持新种类的产品

在实现时最好将工厂作为单件。

如果有多个可能的产品系列,具体工厂也可以使用Prototype原型模式来实现。具体工厂使用产品系列中每一个产品的实例来初始化,且通过复制它的原型来创建新的产品。在基于原型的方法中,使得不是每个新的产品系列都需要一个新的具体工厂类。

定义可扩展的工厂。比如用参数指定将被创建的对象的种类。注意所有的产品都将返回相同类型的抽象接口给用户,可以用dynamic_cast进行类型转换,但是也有可能失败。

 1 #include <iostream>
 2 #include <string>
 3
 4 class AbstractProduct {
 5 public:
 6     virtual ~AbstractProduct() {}
 7     virtual void message() = 0;
 8 };
 9 class Product : public AbstractProduct {
10     virtual ~Product() {}
11     virtual void message() {
12         std::cout << "我是一个普通的Product" << std::endl;
13     }
14 };
15 class ProductEx : public AbstractProduct {
16     virtual ~ProductEx() {}
17     virtual void message() {
18         std::cout << "我是加强后的Product" << std::endl;
19     }
20 };
21
22 class AbstractObject {
23 public:
24     virtual ~AbstractObject() {}
25     virtual void gao() = 0;
26 };
27 class Object : public AbstractObject {
28     virtual ~Object() {}
29     virtual void gao() {
30         std::cout << "虽然叫做Object,但是只是一个普通的Object" << std::endl;
31     }
32 };
33 class ObjectEx : public AbstractObject {
34     virtual ~ObjectEx() {}
35     virtual void gao() {
36         std::cout << "虽然叫做ObjectEx好像很厉害的样子,其实还是一个普通的Object" << std::endl;
37     }
38 };
39
40 class AbstractFactory {
41 public:
42     virtual AbstractProduct* CreateProduct() = 0;
43     virtual AbstractObject* CreateObject() = 0;
44     virtual ~AbstractFactory() {}
45 protected:
46     AbstractFactory(){}
47     AbstractFactory(const AbstractFactory&);
48     AbstractFactory& operator=(const AbstractFactory&);
49 };
50
51 class ConcreteFactory : public AbstractFactory {
52 public:
53     virtual AbstractProduct* CreateProduct() {
54         return new Product();
55     }
56     virtual AbstractObject* CreateObject() {
57         return new Object();
58     }
59     static ConcreteFactory* Instance() {
60         static ConcreteFactory _instance;
61         return &_instance;
62     }
63 };
64
65 class ExtraFactory : public AbstractFactory {
66 public:
67     virtual AbstractProduct* CreateProduct() {
68         return new ProductEx();
69     }
70     virtual AbstractObject* CreateObject() {
71         return new ObjectEx();
72     }
73     static ExtraFactory* Instance() {
74         static ExtraFactory _instance;
75         return &_instance;
76     }
77 };

测试代码

 1 #include <iostream>
 2 #include "Abstract_Factory.h"
 3
 4 using namespace std;
 5
 6 int main()
 7 {
 8     auto fac = ConcreteFactory::Instance();
 9     auto pro = fac->CreateProduct();
10     auto obj = fac->CreateObject();
11     pro->message();
12     obj->gao();
13
14     auto facEx = ExtraFactory::Instance();
15     auto proEx = facEx->CreateProduct();
16     auto objEx = facEx->CreateObject();
17     proEx->message();
18     objEx->gao();
19
20     system("pause");
21 }

测试结果

1 我是一个普通的Product
2 虽然叫做Object,但是只是一个普通的Object
3 我是加强后的Product
4 虽然叫做ObjectEx好像很厉害的样子,其实还是一个普通的Object
5 请按任意键继续. . .
时间: 2024-11-10 09:20:37

Abstract Factory 抽象工厂模式的相关文章

设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要强调一系列相关的产品对象的设计以便进行联合使用. 4.当你提供一个产品类库,而只想显示它们的接口而不是实现. 3.评价 1.它分离了具体的类 2.它使得易于交换产品系列 3.它有利于产品的一致性 4.难以支持新种类的产品 5."开放-封闭"原则要求系统对扩展开放,对修改封闭.通过扩展达到增

c++ 设计模式9 (Abstract Factory 抽象工厂模式)

5.2 抽象工厂模式 动机:在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sql,Oracle等),有连接.命令.读取等功能. 其中命令,连接功能之间有相互联系. 方法一(使用工厂方法): 每个功能类有一个创建的工厂,如IDBConnection与IDBConnectionFactory 1 //数据库访问有关的基类 2 class IDBConnection{ 3

一天一个设计模式——Abstract Factory抽象工厂模式

一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂方法模式中,抽象工厂使用抽象的零件组装成抽象的产品.即使用包含特定的方法接口零件,将零件组装成抽象产品. 二.模式类图: 上面的类图中包含两个包:包含抽象工厂,抽象零件,抽象产品的类所在的包以及具体工厂实现类的包. 三.代码示例 1.Item类: package com.designpattern.

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

概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品),而系统只消费其中某一族的产品.换句话说,抽象工厂创建一整套具有相互依赖或作用关系的产品(至少两个产品),而工厂方法中的工厂只能创建单一系列的产品. 应用场景 客户端不需要知道它所创建的对象的类. 需要一组对象共同完成某种功能时,并且可能存在多组对象完成不同功能的情况. 系统结构稳定,不会频繁地增加

深入浅出设计模式 ------ Abstract Factory(抽象工厂)

一. 定义  提供一个创建一系列相关或相互依赖对象的接口, 而无需指定它们的具体类. 二. 结构 三. 参与者 Product (Fruit和Leaf两个抽象产物) : 抽象生产者接口: TreeFruit(树上的水果). TreeLeaf(树上的叶子). GroundFruit(地上的水果). GroundLeaf(地上的叶子) : 实际的自然产物: NatureFactory: 抽象的自然制造工厂, 用于生产水果和叶子: TreeFactory. LeafFactory : 实际的自然制造工

抽象工厂模式在android中使用

抽象工厂模式(Abstract Factory) 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步延伸和拓展的结果.抽象工厂模式更加抽象化,更具一般性特点. 我们知道,工厂方法模式是针对单一的产品等级结构而产生的,而这里的抽象工厂模式则是针对多个产品等级结构的.当然,单一的产品等级结构也同样适用于抽象工厂模式的.下面为其具体的等级结构图说明: 从上面的结构示意图,可以看到抽象工厂模式中涉及到了多个等级结构的产品角色:同时,针对每一种产品等级结构,都有一种专门的工厂角色负责创建对应的产品,这

设计模式(3)抽象工厂模式(Abstract Factory)

设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 源码地址 0 抽象工厂模式简介 0.0 抽象工厂模式定义 抽象工厂模式一般的书面定义为:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 提供创建接口,无需指定具体实现类,这个原则在简单工厂模式和工厂方法模式篇已经反复讲到了,这是面向接口编程的一个基本准则,很显然,从抽象工厂模式的一般定义中可以看出这也是抽象工厂模式的一个核心,而抽象工厂模式的另

抽象工厂模式(Abstract Factory)

抽象工厂模式是对象的创建模式,他是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构.那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式.这样的话,消费一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品. 抽象工厂模式的结构: 抽象工厂(AbstractFactory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的.通常使用java接口或者抽象java类实现,

抽象工厂模式(Abstract Factory)C#实例

抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 本实例描述了抽象工厂模式的一个使用场景.在动物世界弱肉强食,食肉动物会吃掉食草动物.这是动物世界的规律,因此在动物世界类中有Runfoodchain(运行食物链)方法.在动物世界里总是有食肉动物和食草动物这两个抽象成员.它们之所以是抽象成员是因为他们不是具体的一种动物.而食草动物与食肉动物的区别在