3.抽象工厂模式

简介: 1抽象工厂模式的核心内容是: A:消费者分离,分别用不同的类实现(包含抽象类和实现类) B:操作分离,分别用不同的类实现(包含抽象类和实现类) C:使用工厂类使消费者类和操作类关联起来,有总线的功能。 2抽象工厂模式的作用:使用工厂将分别独立的消费者和实际的操作关联起来。 3抽象工厂模式具体描述 工厂模式:客户类和工厂类分开。 消费者任何时候需

1抽象工厂模式的核心内容是:

A:消费者分离,分别用不同的类实现(包含抽象类和实现类)

B:操作分离,分别用不同的类实现(包含抽象类和实现类)

C:使用工厂类使消费者类和操作类关联起来,有总线的功能。

2抽象工厂模式的作用:使用工厂将分别独立的消费者和实际的操作关联起来。

3抽象工厂模式具体描述

工厂模式:客户类和工厂类分开。

消费者任何时候需要某种产品,只需向工厂请求即可。

 

消费者无须修改就可以接纳新产品。缺点是当产品修改时,

 

工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

 

MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,

虽然口味有所不同,但不管你带MM去麦当劳或肯德基,

只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory

 

消费者不固定,工厂者不固定,(工厂根据消费者动作)

 

实现消费者抽象基类,消费者派生类的实现,实例化就是消费者

 

操作的抽象基类,实现派生类各种操作,实例化的操作

 

工厂的抽象类,抽象类包含了两个抽象类的接口(消费者,操作)

抽象类实现了工厂类的抽象,实例化的派生类,实现工厂,

根据用户设置用户,根据操作设置操作

4.策略模式类图

5.代码:

#include<iostream>

#include <string>

 

using namespace std;

 

//工厂模式:客户类和工厂类分开。

//消费者任何时候需要某种产品,只需向工厂请求即可。

 

//消费者无须修改就可以接纳新产品。缺点是当产品修改时,

 

//工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

//

//MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,

//虽然口味有所不同,但不管你带MM去麦当劳或肯德基,

//只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory

 

//消费者不固定,工厂者不固定,(工厂根据消费者动作)

 

//实现消费者抽象基类,消费者派生类的实现,实例化就是消费者

 

//操作的抽象基类,实现派生类各种操作,实例化的操作

 

//工厂的抽象类,抽象类包含了两个抽象类的接口(消费者,操作)

//抽象类实现了工厂类的抽象,实例化的派生类,实现工厂,

//根据用户设置用户,根据操作设置操作

 

class IUser

{

public:

    //纯虚接口类,抽象类

    virtual void getUser() = 0;

    virtual void setUser() = 0;

};

 

//继承抽象实现sql数据库使用者的实例化

class SqlUser :public IUser

{

public:

    void getUser()

    {

        cout << "sql中返回user" << endl;

    }

    void setUser()

    {

        cout << "sql中设置user" << endl;

    }

};

 

//继承抽象实现access数据使用者的实例化

class AccessUser :public IUser

{

public:

    void getUser()

    {

        cout << "Access中返回user" << endl;

    }

    void setUser()

    {

        cout << "Access中设置user" << endl;

    }

};

 

//抽象类,提供接口

class IDepartment

{

public:

    virtual void getDepartment() = 0;

    virtual void setDepartment() = 0;

};

 

//SQL操作的实现

class SqlDepartment :public IDepartment

{

public:

    void getDepartment()

    {

        cout << "sql中返回Department" << endl;

    }

    void setDepartment()

    {

        cout << "sql中设置Department" << endl;

    }

};

 

//access操作的实现

class AccessDepartment :public IDepartment

{

public:

    void getDepartment()

    {

        cout << "Access中返回Department" << endl;

    }

    void setDepartment()

    {

        cout << "Access中设置Department" << endl;

    }

};

 

//抽象工厂

class IFactory

{

public:

    virtual IUser *createUser() = 0;

    virtual IDepartment *createDepartment() = 0;

};

 

//抽象工厂一个实现

class SqlFactory :public IFactory

{

public:

    IUser *createUser()

    {

        return new SqlUser();

    }

    IDepartment *createDepartment()

    {

        return new SqlDepartment();

    }

};

 

//抽象工厂一个实现

class AccessFactory :public IFactory

{

public:

    IUser *createUser()

    {

        return new AccessUser();

    }

    IDepartment *createDepartment()

    {

        return new AccessDepartment();

    }

};

 

//变相的实现了静态类

class DataAccess

{

private:

    static string db;

    //string db="access";

public:

    static IUser *createUser()

    {

        if (db == "access")

        {

            return new AccessUser();

        }

        else if (db == "sql")

        {

            return new SqlUser();

        }

    }

    static IDepartment *createDepartment()

    {

        if (db == "access")

        {

            return new AccessDepartment();

        }

        else if (db == "sql")

        {

            return new SqlDepartment();

        }

    }

};

string DataAccess::db = "sql";

 

int main()

{

    //IFactory *factory=new SqlFactory();

    IFactory *factory;//抽象工厂

    IUser *user;//抽象消费者

    IDepartment *department;//提供的操作

 

    factory = new AccessFactory();//基类的指针指指向派生类的对象

    user = factory->createUser();//基类的指针指向派生类的对象

    department = factory->createDepartment();//基类的指针指向派生类的对象

 

    user->getUser();

    user->setUser();//访问acesss接口

 

    department->getDepartment();

    department->setDepartment();//接口

 

    cout << "--------------------" << endl;

 

    user = DataAccess::createUser();

    department = DataAccess::createDepartment();

 

    user->getUser();

    user->setUser();

    department->getDepartment();

    department->setDepartment();

 

    cin.get();

    return 0;

}

运行结果如下:


目录
相关文章
|
4天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
288 116
|
19天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
408 38
Meta SAM3开源:让图像分割,听懂你的话
|
13天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
670 220
|
1天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
132 95
|
11天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1664 158
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
912 61