设计模式 - AbstractFactory抽象工厂
来源:互联网 发布:mac office 激活码 编辑:程序博客网 时间:2024/05/23 19:12
1.简单描述
抽象工厂包含两部分:一是继承自同一个抽象类的产品类族;二是不同类型的抽象工厂。抽象工厂中可以创建该类产品所需要的元素(创建产品类的数据成员),而生产的所有元素便是抽象工厂的产物。由于抽象工厂可以生成许多元素,所以我们又可以认为,抽象工厂是封装了多个工厂方法,对于每一个元素就相当于一个工厂方法。到底是哪一种类型的元素则由具体的工厂类型决定(子类决定)。产品不再作为抽象工厂的直接输出产物,而是使用工厂的输出组合而成,所以产品可以更加抽象不用再区分大类(大类由抽象工厂决定)。
2.类图
。。。。。。。。
待补
3.实例程序
3.1 元素定义
#ifndef Ingredient_H#define Ingredient_H#include <string>#include <iostream>class IngredientA{public: virtual void printIngredientName() = 0;};class IngredientA1: public IngredientA{ void printIngredientName() { std::cout<<"IngredientA1"<<std::endl; }};class IngredientA2: public IngredientA{ void printIngredientName() { std::cout<<"IngredientA2"<<std::endl; }};class IngredientB{public: virtual void printIngredientName() = 0;};class IngredientB1: public IngredientB{ void printIngredientName() { std::cout<<"IngredientB1"<<std::endl; }};class IngredientB2: public IngredientB{ void printIngredientName() { std::cout<<"IngredientB2"<<std::endl; }};#endif
3.2 产品定义
// product.h#ifndef Product_H#define Product_H#include "Ingredient.h"class AbstractFactory;class Product{public:Product(){}; virtual ~Product(){}; virtual void printProductName() = 0;};class ProductA: public Product{public: ProductA(const AbstractFactory& factory);virtual ~ProductA(){}; virtual void printProductName();private: IngredientA* m_pIA; // IngredientB* m_pIB;};class ProductB: public Product{public: ProductB(const AbstractFactory& factory);virtual ~ProductB(){}; virtual void printProductName();private: IngredientA* m_pIA; IngredientB* m_pIB;};#endif
// product.cpp#include "stdafx.h"#include <iostream>#include "Product.h"#include "AbstractFactory.h"using namespace std;ProductA::ProductA(const AbstractFactory& factory){ m_pIA = factory.createIngredientA();}void ProductA::printProductName(){ cout<<"ProductA->"; if (NULL != m_pIA) { m_pIA->printIngredientName(); }}ProductB::ProductB(const AbstractFactory& factory){ m_pIA = factory.createIngredientA(); m_pIB = factory.createIngredientB();}void ProductB::printProductName(){ cout<<"ProductB->"; if (NULL != m_pIB) { m_pIB->printIngredientName(); } cout<<"ProductB->"; if (NULL != m_pIA) { m_pIA->printIngredientName(); }}
3.3 工厂定义
// factory,h#ifndef AbstractFactory_H#define AbstractFactory_H#include "Ingredient.h"class AbstractFactory{public: virtual IngredientA* createIngredientA() const = 0; virtual IngredientB* createIngredientB() const = 0;};class AbstractFactoryA: public AbstractFactory{public:AbstractFactoryA(){};~AbstractFactoryA(){}; virtual IngredientA* createIngredientA() const; virtual IngredientB* createIngredientB() const;};class AbstractFactoryB: public AbstractFactory{public:AbstractFactoryB(){};~AbstractFactoryB(){}; virtual IngredientA* createIngredientA() const; virtual IngredientB* createIngredientB() const;};#endif
// factory.cpp#include "stdafx.h"#include "AbstractFactory.h"IngredientA* AbstractFactoryA::createIngredientA() const{ return new IngredientA1();}IngredientB* AbstractFactoryA::createIngredientB() const{ return new IngredientB1();}IngredientA* AbstractFactoryB::createIngredientA() const{ return new IngredientA2();}IngredientB* AbstractFactoryB::createIngredientB() const{ return new IngredientB2();}
3.4 测试程序
// test.cpp#include <iostream>#include "AbstractFactory.h"#include "Product.h"using namespace std;int main(int argc, char const *argv[]){ /* code */ AbstractFactoryA factoryA; AbstractFactory& factory1 = factoryA; Product* produce1 = new ProductA(factory1); if (NULL != produce1) { produce1->printProductName(); delete produce1; produce1 = NULL; } produce1 = new ProductB(factory1); if (NULL != produce1) { produce1->printProductName(); delete produce1; produce1 = NULL; } AbstractFactoryB factoryB; factory1 = factoryB; produce1 = new ProductA(factory1); if (NULL != produce1) { produce1->printProductName(); delete produce1; produce1 = NULL; } produce1 = new ProductB(factory1); if (NULL != produce1) { produce1->printProductName(); delete produce1; produce1 = NULL; } return 0;}
4.扩展分析
4.1 产品扩展
1.对于普通工厂模式,新增产品需要扩充产品子类,在一个或多个工厂类中加入新扩充产品的创建。
2.对于抽象工厂模式,新增产品只需要扩充产品子类,新产品可有老元素组合而成,工厂类不用变化,也不会加减。
4.2 产品元素扩展
1.对于普通工厂模式,需要修改所有加入新元素的类。
2.对于抽象工厂模式,需要修改所有加入新元素的类,同时修改需要生成该元素的工厂。
0 0
- 设计模式--抽象工厂(AbstractFactory)
- 设计模式 - AbstractFactory抽象工厂
- [设计模式]AbstractFactory抽象工厂模式
- 设计模式 -- 抽象工厂模式 AbstractFactory
- 设计模式之抽象工厂模式(AbstractFactory)
- C++设计模式-AbstractFactory抽象工厂模式
- C++设计模式-AbstractFactory抽象工厂模式
- 【设计模式】-抽象工厂模式-AbstractFactory
- C++设计模式-AbstractFactory抽象工厂模式
- 设计模式 — 抽象工厂模式 (AbstractFactory)
- 设计模式-抽象工厂模式-abstractfactory-python
- C++设计模式-AbstractFactory抽象工厂模式
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- 静态广播与动态广播的区别
- js中扩充类型的功能
- shiro的使用2 灵活使用shiro的密码服务模块
- PAT:A1095. Cars on Campus (0/30)
- 伪代码编程过程
- 设计模式 - AbstractFactory抽象工厂
- 联网下载图片转位图
- echar
- CJOJ P1976 二叉苹果树
- Android的一些小知识
- 【Spark你妈喊你回家吃饭-03】Spark RDD的蛮荒世界
- 数据结构实验之数组三:快速转置
- 重启APP
- TI文档中相关的缩写: