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

2023-11-10

工厂模式属于创建型模式
基本原理:使用一个工厂类统一生产各种产品。
主要流程:
        1.创建产品的基类,便于统一返回创建的产品
        2.创建各种产品,继承基类,注意多态
        3.创建工厂类,对每种产品进行区分创建。
        4.在使用时要先实例化工厂类,在调用期内生产的方法。
优点:
        1.一个调用者想创建一个对象,只要知道其名称就可以了。
        2.扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
        3.屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
        1.每新增一种类型的产品都要增加一个具体的产品类和工厂类。

#include <iostream>
#include <string>
using namespace std;

//创建一个种类
class Shape
{
public:
    //
    virtual void draw() = 0;
};

class A : public Shape
{
public:
    void draw()
    {
        cout<<"生产了一个A"<<endl;
    }
};
class B : public Shape
{
public:
    void draw()
    {
        cout<<"生产了一个B"<<endl;
    }
};
class C : public Shape
{
public:
    void draw()
    {
        cout<<"生产了一个C"<<endl;
    }
};

//创建一个工厂
class ShapeFactory
{
public:
    Shape * getShape(string shapeType)
    {
        if(shapeType == "A")
        {
            return new A();
        }
        else if(shapeType == "B")
        {
            return new B();
        }
        else if(shapeType == "C")
        {
            return new C();
        }
        else
        {
            return NULL;
        }
    }

};

int main()
{
    ShapeFactory *factory = new ShapeFactory();

    Shape *shapeA = factory->getShape("A");
    shapeA->draw();

    return 0;
}

 

抽象工厂模式其实是工厂模式的封装,就是在工厂模式上边在包装一层,建立一个工厂的生成器。使用时先生成工厂,再使用该工厂的功能。

#include <iostream>
#include <string>
using namespace std;
//创建一个种类
class Shape
{
public:
    virtual void draw() = 0;
};
class Rectangle : public Shape
{
public:
    void draw()
    {
        cout<<" Rectangle::draw "<<endl;
    }
};
class Circle : public Shape
{
public:
    void draw()
    {
        cout<<" Circle::draw "<<endl;
    }
};
class Square : public Shape
{
public:
    void draw()
    {
        cout<<" Square::draw "<<endl;
    }
};

//创建另一种种类
class Color
{
public:
    virtual void fill() = 0;
};
class Red : public Color
{
public:
    void fill()
    {
        cout<<" Red::fill "<<endl;
    }
};
class Green : public Color
{
public:
    void fill()
    {
        cout<<" Green::fill "<<endl;
    }
};
class Blue : public Color
{
public:
    void fill()
    {
        cout<<" Blue::fill "<<endl;
    }
};

//创建抽象工厂基类
class AbstractFactory
{
public:
    virtual Color * getColor(string color) = 0;
    virtual Shape * getShape(string shape) = 0;
};
//创建种类工厂,扩展AbstractFactory的工厂类
class ShapeFactory : public AbstractFactory
{
public:
    Shape * getShape(string shapeType)
    {
        if(shapeType == "Rectangle")
        {
            return new Rectangle();
        }
        else if(shapeType == "Square")
        {
            return new Square();
        }
        else if(shapeType == "Circle")
        {
            return new Circle();
        }
        else
        {
            return NULL;
        }
    }
    Color * getColor(string color)
    {
        return NULL;
    }
};
class ColorFactory : public AbstractFactory
{
public:
    Shape * getShape(string shapeType)
    {
        return NULL;
    }
    Color * getColor(string colorType)
    {
        if(colorType == "Red")
        {
            return new Red();
        }
        else if(colorType == "Green")
        {
            return new Green();
        }
        else if(colorType == "Blue")
        {
            return new Blue();
        }
        else
        {
            return NULL;
        }
    }
};

//创建工厂生成器,用来生成工厂
class FactoryProducer
{
public:
    AbstractFactory * getFactory(string factoryType)
    {
        if(factoryType == "shape")
        {
            return new ShapeFactory();
        }
        else if (factoryType == "color")
        {
            return new ColorFactory();
        }
        else
        {
            return NULL;
        }
    }
};


int main()
{
    FactoryProducer * factoryProducer = new FactoryProducer();
    AbstractFactory * shapeFactory = factoryProducer->getFactory("shape");
    Shape * shape = shapeFactory->getShape("Circle");
    shape->draw();
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式--工厂模式--抽象工厂模式 的相关文章

  • 设计模式-单一职责原则介绍与理解

    描述 一个类应该专注于实现一个功能 好处 便于代码复用 举例 俄罗斯方块游戏 首先可以想到的是游戏逻辑与界面的分离 也就是说逻辑一个类 界面部分一个类 这样做的好处就是我们可以复用游戏逻辑的代码 例如我们用java写了一个基于PC端的俄罗斯
  • python语法(高阶)-设计模式(单例模式)

    参考内容 黑马程序员
  • 设计模式之(三)---工厂方法模式

    女娲补天的故事大家都听过吧 这个故事是说 女娲在补了天后 下到凡间一看 哇塞 风景太优美了 天空是湛 蓝的 水是清澈的 空气是清新的 太美丽了 然后就待时间长了就有点寂寞了 没有动物 这些看的到 都是静态的东西呀 怎么办 别忘了是神仙呀 没
  • 设计模式——原型模式

    原型模式顾名思义 就是指以某个实例为原型 copy出一个新的实例 该实例属性与原型相同或者是类似 很多时候 我们需要创建大量的相同或者相似的对象 如果一个个用new 构造函数的形式去创建的话比较繁琐 就像孙悟空要想变出成千上万个猴子猴孙总不
  • Java设计模式:装饰者模式(Decorator Pattern)

    装饰者模式 涉及的重要设计原则 类应该对扩展开放 对修改关闭 装饰者模式定义 装饰者模式动态地将责任附加到对象上 若要扩展功能 装饰者提供了比继承更有弹性的替代方案 UML类图 装饰者模式事例 咖啡店 咖啡种类 1 深焙咖啡 DarkRoa
  • 设计模式--组合模式

    组合模式 又叫部分整体模式 属于结构型模式 基本原理 以树形的结构将相似的对象组合起来 主要流程 1 创建对象 2 在对象中设置用来存放下一级相似对象的数据结构 3 在对象中设置增删改查等功能 注意 这种模式和数据结构中的树形结构相似 in
  • 简单工厂模式

    简单工厂模式 一 概念 从设计模式的类型上来说 简单工厂模式是属于创建型模式 又叫做静态工厂方法 StaticFactory Method 模式 但不属于23种GOF设计模式之一 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 简
  • C++设计模式-State状态模式

    State状态模式作用 当一个对象的内在状态改变时允许改变其行为 这个对象看起来像是改变了其类 UML图如下 State类 抽象状态类 定义一个接口以封装与Context的一个特定状态相关的行为 ConcreteState类 具体状态 每一
  • 分享几个项目中用到的设计模式

    前言 之前项目中出于扩展性和有雅性的考虑 使用了多种设计模式进行项目框架的设计 主要的一些设计模式是单例模式 工厂模式 策略模式 责任链模式 代理模式这几种 现在依次讲讲这几个的主要是实现方式和在我们项目中的应用场景 核心设计模式分享 单例
  • 设计模式--提供者模式provider

    设计模式 C 提供者模式 Provider Pattern 介绍 为一个API进行定义和实现的分离 示例 有一个Message实体类 对它的操作有Insert 和Get 方法 持久化数据在SqlServer数据库中或Xml文件里 根据配置文
  • [设计模式]模板方法模式(Template Method)

    1 意图 定义一个操作中的算法的骨架 而将一些步骤延迟到子类中 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 2 动机 其实就是如意图所描述的 算法的骨架是一样的 就是有些特殊步骤不一样 就可以
  • 组合型模式

    概述 对于这个图片肯定会非常熟悉 上图我们可以看做是一个文件系统 对于这样的结构我们称之为树形结构 在树形结构中可以通过调用某个方法来遍历整个树 当我们找到某个叶子节点后 就可以对叶子节点进行相关的操作 可以将这颗树理解成一个大的容器 容器
  • 设计模式-享元模式

    一 概念 如果在一个系统中存在多个相同的对象 那么只需要共享一份对象的拷贝 而不必为每一次使用都创建新的对象 目的是提高系统性能 上面的概念乍一听好像单例模式其实不是 单例模式只保存一个对象 但是这里可以有很多个不同对象 但是每个对象只有一
  • 哈工大2020软件构造Lab3实验报告

    本项目于4 21日实验课验收 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构造 课程Lab3实验报告 Software Construction 2020 Spring Lab 3
  • 设计模式(不懂)

    面试中经常问到设计模式 我才对这个东西了解了一下 才发现他是没有开发的新大陆 是oo设计的更高级别 能把设计模式搞懂 那oo你就搞的差不多了 随便看了还是很有意思的 虽然不怎么懂 百科名片 相关书籍 设计模式 Design pattern
  • 泛型与反射机制在JDBC和Servlet编程中的实践

    写在前面 泛型与反射是java中的两种强大机制 可以很好的提高代码的灵活性和复用性 本篇文章向大家展现在JDBC和Servlet编程场景下反射和泛型技术的实践 通过灵活使用这两种机制打造 高度可复用的JDBC和Servlet代码 1 JDB
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • 【设计模式之美】面向对象分析方法论与实现(二):需求到接口实现的方法论

    文章目录 一 进行面向对象设计 1 划分职责 gt 需要有哪些类 2 定义类及其属性和方法 3 定义类与类之间的交互关系 4 将类组装起来并提供执行入口 二 如何进行面向对象编程 1 接口实现
  • 系列一、 单例设计模式

    一 单例设计模式 1 1 概述 单例模式 Singleton Pattern 是Java中最简单的设计模式之一 这种类型的设计模式属于创建者模式 它提供了一种创建对象的最佳方式 这种模式涉及到一个单一的类 该类负责创建自己的对象 同时确保只

随机推荐

  • ninja: error: ‘system/bt/EventLogTags.logtags‘, needed by ‘out/target/common/obj/all-event-log-tags.

    项目场景 编译环境 ubuntu18 04 软件版本 全志SDK 安卓版本8 1 0 linux 4 9 0 问题描述 编译SDK时遇到这个问题 97 43 44 glob device Android bp ninja error sys
  • (HTML5)第一章

    HTML5秘籍 第一部分适合浏览器升级时参考 参考网址 H5API https github com Modernizr Modernizr wiki HTML5 Cross browser Polyfills 书本案例 http www
  • vue el-input表单验证禁止输入空格

    element ui 中自带的表单必填项校验输入空格时 依然能逃过验证 required true还是可以通过 需要再 在v model 加上 trim 来禁止输入空格字符 加上之后则不能输入空格
  • 唐老师讲运算放大器(第五讲)——运放的应用

    一 常见运放的应用 二 运放用于电源降压 图示的D1为2 5V稳压管 若VIN 12V 那么运放的同相输入端为2 5V 又虚短可知 反向输入端的电压也为2 5V 那么Rfb2和Rfb1中间节点的电压为2 5V 此时 有运算放大器的性质可知
  • 知识蒸馏 (一) 综述

    一 综述 Knowledge Distillation A Survey 2021 IJCV Knowledge Distillation and Student Teacher Learning for Visual Intelligen
  • 《C和指针》笔记29:数组名和指针

    看下面的代码 int b 10 b 4 的类型是整型 但b的类型又是什么 它所表示的又是什么 一个合乎逻辑的答案是它表示整个数组 但事实并非如此 在C中 在几乎所有使用数组名的表达式中 数组名的值是一个指针常量 也就是数组第1个元素的地址
  • 斐波那契数列求和--C语言

    include
  • 服务器net0显示linkdown,某局点S10500交换机设备接口up/down的trap中没显示端口号信息...

    某客户使用我司S10500系列交换机 在使用过程中 用户配置了SNMP网管服务器 同时将设备的告警信息发送给网管服务器 在使用过程中发现 部分设备的接口变化的告警信息中没有具体接口号相关信息 只有接口索引值 如下为客户现场S10500交换机
  • 【Unity项目】登录界面

    数据库 登录时验证用户名和密码 使用MySQL数据库管理数据 类中的主要方法也都是使用SQL语句完成 类中还提供两个接口 一个通过username获取UserInfo 一个是直接获取到排行榜 数据库连接类 using System usin
  • Java中的Thread类

    目录 一 什么是Thread类 二 Thread类的基本用法 三 线程的并发执行 一 什么是Thread类 在java标准库中 提供了一个Thread类 用来表示 操作线程 Thread类可以视为是Java标准库提供的API Java是支持
  • img图片在限定尺寸下等比缩放;点击查看原图

    一 图片等比缩放 效果 html div class row img src div div class row div 查看原图 div div css 对img外层div尺寸限制 img长宽自适应 imgbox max width 10
  • Vue脚手架

    安装 前提 Node js安装 打开想要建脚手架的文件夹 把文件夹的地址改为cmd打开终端输入以下代码 1 执行npm install g vue cli安装脚手架 2 安装完成后 可以使用vue version 3 我们测试下 在桌面创建
  • 微软网盘onedrive

    将微软网盘 做成一个共享网站 好处就是可以分享大文件 而且还不限制下载速度 如果你受够了百度网盘的限速 可以试试这个 来看看常见的几款Onedrive网盘程序 1 OneIndex 第一个微软网盘分享程序 php编写 兼容性好 我在用 作者
  • Qt鼠标事件

    新建桌面应用程序testMouseEvent 类名MouseEvent 基类QMainWindow 通过重写鼠标事件达到跟踪鼠标位置的效果 添加2个标签做转态及位置更新用 重写鼠标事件 mouseevent h ifndef MOUSEEV
  • 早早踏入刷脸支付市场的人收获颇丰

    支付行业是永远不会萧条的行业 因为只要市场上存在交易 有资金流通就需要支付工具的支撑 不仅如此 支付行业的收入十分稳定 它产生的利润不会受商品价位变化的周期性影响 无论商家经营好坏 它的利润都是保持不变的 所以支付行业对于一些追求持续稳定利
  • 基于python的数字图像处理--学习笔记(三)

    基于python的数字图像处理 学习笔记 三 前言 一 灰度拉伸 二 幂律 伽马 变换 三 对数变换 前言 进入冈萨雷斯的第三章内容 并用python实现功能 我更改了代码源 之前找到太烂了 代码全是错 现在使用的代码很清晰 功能也很全 一
  • pytorch: where、gather函数

    一 where函数 torch where condition x y out x if condition is 1 y if condition is 0 In 29 cond torch rand 2 2 In 30 cond Out
  • Python-Numpy多维数组--切片,索引,高级索引,布尔索引

    一 Numpy 切片和索引 ndarray对象的内容可以通过索引或切片来访问和修改 就像 Python 的内置容器对象一样 如前所述 ndarray对象中的元素遵循基于零的索引 有三种可用的索引方法类型 字段访问 基本切片和高级索引 基本切
  • 苹果公司开始招人发力6G无线技术,你们怎么看?

    全球财经观察 新闻速递 看行业 根据彭博社的Mark Gurman发现的招聘信息 苹果正在招聘工程师 从事下一代6G无线技术的研发 根据Gurman的报道 这些职位位于苹果公司在硅谷和圣迭戈办公室 该公司在那里从事无线技术研发和芯片设计 新
  • 设计模式--工厂模式--抽象工厂模式

    工厂模式属于创建型模式基本原理 使用一个工厂类统一生产各种产品 主要流程 1 创建产品的基类 便于统一返回创建的产品 2 创建各种产品 继承基类 注意多态 3 创建工厂类 对每种产品进行区分创建 4 在使用时要先实例化工厂类 在调用期内生产