常用设计模式之抽象工厂模式

原创 2017年07月11日 17:57:00

抽象工厂模式:
抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
应用场景:
当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品。抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。
这里写图片描述
实现代码:

//Product.h
#ifndef PRODUCT_H
#define PRODUCT_H

class AbstractProductA
{
public:
    virtual ~AbstractProductA();
protected:
    AbstractProductA();
private:
};
class AbstractProductB
{
public:
    virtual ~AbstractProductB();
protected:
    AbstractProductB();
private:
};
class ProductA1:public AbstractProductA
{
public:
    ProductA1();
    ~ProductA1();
};
class ProductA2:public AbstractProductA
{
public:
    ProductA2();
    ~ProductA2();
};
class ProductB1:public AbstractProductB
{
public:
    ProductB1();
    ~ProductB1();
};
class ProductB2:public AbstractProductB
{
public:
    ProductB2();
    ~ProductB2();
};

#endif // PRODUCT_H
//Product.cpp

#include"product.h"
#include<iostream>

using namespace std;

AbstractProductA::AbstractProductA()
{

}
AbstractProductA::~AbstractProductA()
{

}
AbstractProductB::AbstractProductB()
{

}
AbstractProductB::~AbstractProductB()
{

}
ProductA1::ProductA1()
{
    cout<<"ProductA1..."<<endl;
}
ProductA1::~ProductA1()
{

}
ProductA2::ProductA2()
{
    cout<<"ProductA2..."<<endl;
}
ProductA2::~ProductA2()
{

}
ProductB1::ProductB1()
{
    cout<<"ProductB1..."<<endl;
}
ProductB1::~ProductB1()
{

}
ProductB2::ProductB2()
{
    cout<<"ProductB2..."<<endl;
}
ProductB2::~ProductB2()
{

}
//AbstractFactory.h

#ifndef ABSTRACTFACTORY_H
#define ABSTRACTFACTORY_H
class AbstractProductA;
class AbstractProductB;

class AbstractFactory
{
public:
    virtual ~AbstractFactory();
    virtual AbstractProductA* CreateProductA()=0;
    virtual AbstractProductB* CreateProductB()=0;
protected:
    AbstractFactory();
};
class ConcreteFactory1:public AbstractFactory
{
public:
    ConcreteFactory1();
    ~ConcreteFactory1();
    AbstractProductA* CreateProductA();
    AbstractProductB* CreateProductB();
};
class ConcreteFactory2:public AbstractFactory
{
public:
    ConcreteFactory2();
    ~ConcreteFactory2();
    AbstractProductA* CreateProductA();
    AbstractProductB* CreateProductB();
};

#endif // ABSTRACTFACTORY_H
//AbstractFactory.cpp

#include"abstractfactory.h"
#include"product.h"
#include<iostream>

using namespace std;

AbstractFactory::AbstractFactory()
{

}
AbstractFactory::~AbstractFactory()
{

}
ConcreteFactory1::ConcreteFactory1()
{

}
ConcreteFactory1::~ConcreteFactory1()
{

}
AbstractProductA* ConcreteFactory1::CreateProductA()
{
    return new ProductA1();
}
AbstractProductB* ConcreteFactory1::CreateProductB()
{
    return new ProductB1();
}
ConcreteFactory2::ConcreteFactory2()
{

}
ConcreteFactory2::~ConcreteFactory2()
{

}
AbstractProductA* ConcreteFactory2::CreateProductA()
{
    return new ProductA2();
}
AbstractProductB* ConcreteFactory2::CreateProductB()
{
    return new ProductB2();
}

//Main.cpp

#include"abstractfactory.h"
#include<iostream>

using namespace std;

int main(int argc, char *argv[])
{
    AbstractFactory* cf1 = new ConcreteFactory1();

    cf1->CreateProductA();
    cf1->CreateProductB();

    AbstractFactory* cf2 = new ConcreteFactory2();

    cf2->CreateProductA();
    cf2->CreateProductB();

    system("pause");
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

【java设计模式】之 抽象工厂(Abstract Factory)模式

1. 女娲的失误         上一节学习了工厂模式,女娲运用了该模式成功创建了三个人种,可是问题来了,她发现没有性别……这失误也忒大了点吧……竟然没有性别,那岂不是……无奈,只好抹掉重来了,于是所...
  • eson_15
  • eson_15
  • 2016年04月26日 23:49
  • 11610

设计模式之禅-抽象工厂模式

设计模式之禅- 抽象工厂模式
  • sunpeng19960715
  • sunpeng19960715
  • 2016年07月28日 23:13
  • 221

读秦小波《设计模式之禅》 -- 工厂模式

设计模式是一种非常有用的编程技巧,它对于代码的重构有些非常重要的作用,对于软件开发人员来说,需要理解并尝试着使用这些设计的方法。      个人感觉《设计模式之禅》这本书中讲解的非常具体,每个模式都配...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2014年12月25日 08:36
  • 2723

大话设计模式—桥接模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。主要解决:在有多种可能会变化的情况下,...
  • lmb55
  • lmb55
  • 2016年04月02日 15:27
  • 1557

SSH中用到的设计模式之三——工厂方法和抽象工厂

工厂方法和抽象工厂是为了优化简单工厂而生的,所以朋友们先需要看了上面一页的的简单工厂在来读下面的3的内容。 首先,还是谈谈自己想法,我之所以这种顺序写,就是为了让大家理解设计模式的美,我的理解就是:...
  • cc6208048
  • cc6208048
  • 2014年11月02日 20:33
  • 695

大话设计模式C++实现-第15章-抽象工厂模式

一、UML图 二、包含的角色 (1)抽象工厂 (2)具体工厂:包括具体工厂1和具体工厂2。具体工厂1用于生产具体产品A1和具体产品B1,具体工厂2用于生产具体产品A2和具体产品B2; (3)抽象产...
  • XD_lixin
  • XD_lixin
  • 2014年11月16日 23:09
  • 1610

走穿java23种设计模式-3抽象工厂模式详解

走穿java23种设计模式-3工厂方法模式详解工厂模式可以分为:简单工厂模式,工厂方法模式,抽象工厂模式。简单工厂模式就没什么好说的了,无非是所有的东西都写在一个类里面,要什么就调用什么,如果要添加新...
  • wenzhi20102321
  • wenzhi20102321
  • 2017年10月03日 03:24
  • 724

【C#设计模式-抽象工厂模式】

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。 抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,...
  • heyangyi_19940703
  • heyangyi_19940703
  • 2016年04月20日 13:04
  • 1978

设计模式——抽象工厂模式详解

0.前言写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~无...
  • SEU_Calvin
  • SEU_Calvin
  • 2016年08月21日 17:05
  • 10479

Java设计模式—工厂方法模式&抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式。 通用类图如下:         在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;C...
  • qq_25827845
  • qq_25827845
  • 2016年09月11日 15:07
  • 4687
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:常用设计模式之抽象工厂模式
举报原因:
原因补充:

(最多只允许输入30个字)