首页 > 其他分享 >工厂模式(正式)

工厂模式(正式)

时间:2023-09-24 14:55:12浏览次数:33  
标签:正式 void virtual 工厂 抽象 模式 shared public

抽象工厂模式及示例

模式的动机

  1. 提供一种接口,用于创建一系列相关或相互依赖的对象

  2. 抽象工厂模式通过引入抽象工厂接口,允许客户端代码通过工厂接口创建产品,而不需要关心具体的产品类;

  3. 使得客户端代码可以与特定产品的具体类解耦,实现了抽象和实现的分离

模式的实现

  1. 抽象的工厂和抽象的类,扩展的整体风格
  2. 抽象工厂模式的实现,一系列有相互依赖相互作用的对象组合的生成
  3. 抽象工厂模式的缺点是难以应对”新对象”的需求变动

我们设想这样一个情景:

  • 考虑两个平台:Windows 和 MAC
  • 有两个ui组件:
  • PushButton : click, close;
  • MainWindow : show, close;
  • QT在UI控件中创建按钮对象,实际上这个按钮需要继承自很多基类,但是对于用户来说可能就是一行代码的事,实现了抽象与具体需求实现的分离
class PushButton
{
public:
	//
	virtual void Click() = 0;
	virtual void Close() = 0;
};

class MainWindow
{
public:
	virtual void Show() = 0;
	virtual void Close() = 0;
};

class GUIFactory 
{
public:
	virtual  shared_ptr<PushButton> CreateButton() = 0;
	virtual shared_ptr<MainWindow>  CreateWindow() = 0;
};

这里定义了三个抽象类,PushButton 和 MainWindow 是 GUI 元素,GUIFactory 是用于创建这些元素的抽象工厂。
下面我们实现一下Windows下的实现:

#pragma once
#include "UI.h"
#include <iostream>
using namespace std;

class WindowsButton: public PushButton
{
public:
	virtual void Click()
	{
		cout << "WindowsButton::Click" << endl;
	}
	virtual void Close()
	{
		cout << "WindowsButton::Close" << endl;
	}
};

class WindowsWindow:public MainWindow
{
public:
	virtual void Show()
	{
		cout << "WindowsWindow::Show" << endl;
	}
	virtual void Close()
	{
		cout << "WindowsWindow::Close" << endl;
	}
};

class WindowsFactory: public GUIFactory
{
public:
	virtual  shared_ptr<PushButton> CreateButton()
	{
		return make_shared<WindowsButton>();
	}
	virtual shared_ptr<MainWindow>  CreateWindow()
	{
		return make_shared<WindowsWindow>();
	}
};

上面就是一个Windows风格的实现,实际上,我们在按照上面Windows的方式扩充了Mac OS和Linux风格的实现之后,我们可以按照下面的方式在main函数中如何使用。

标签:正式,void,virtual,工厂,抽象,模式,shared,public
From: https://www.cnblogs.com/Gal0721/p/17725983.html

相关文章

  • Kibana数据索引模式设计策略案例
    前言Kibana是一个非常流行的数据可视化工具,它可以帮助我们快速地对数据进行分析和展示。在使用Kibana的过程中,数据索引模式的设计非常重要,它直接影响到我们对数据的查询和分析效率。本文将介绍一些Kibana数据索引模式设计的策略案例,希望能够帮助大家更好地使用Kibana。策略一:尽量......
  • 代理模式
    工作场景:让用户根据接口查询系统各资源占用率优化用户性能传统代码:传统代码//main.cpp#include<iostream>#include"ServerInfoGetter.h"#include<chrono>#include<thread>intmain(){ ServerInfoGettergetter; ServerInfoinfo=getter.getInfo(); whil......
  • Redis搭建哨兵模式架构
    使用Docker安装因为配置太复杂,所以这里我们使用dockercompose来一键部署不使用内部网络搭建编写redis主从docker-compose.ymlversion:'3'services:master:image:rediscontainer_name:redis-masterrestart:alwayscommand:redis-server--requi......
  • Remix 2.0 正式发布,现代化全栈Web框架!
    9月16日,全栈Web框架Remix正式发布了2.0版本,Remix团队在发布1.0版本后经过近2年的持续努力,发布了19个次要版本、100多个补丁版本,并解决了数千个问题和拉取请求,终于迎来了第二个主要版本!Remix具有以下特性:追求速度、用户体验(UX),支持任何SSR/SSG等基于We......
  • 工厂模式
    工作场景:编写一个给用户发送短信的程序传统写法#include<stdio.h>#include<string>enumNotifMessageType{WUDI,FEITIAN};classNotifMessage{public:intsendMessage(longlonguserId,std::string&msg,NotifMessageTypetype){s......
  • 模式
    模式2.7.1.1、模式的定义定义模式实际上定义了一个命名空间,在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等。在CREATESCHEMA中可以接受CREATETABLE,CREATEVIEW和GRANT子句。CREATESCHEMA<模式名>AUTHORIZATION<用户名>[<表定义子句>|<视图定义子句>|<......
  • Next.js 13.5 正式发布,速度大幅提升!
    9月19日,Next.js13.5正式发布,该版本通过以下方式提高了本地开发性能和可靠性:本地服务器启动速度提高22%:使用App和PagesRouter可以更快地进行迭代HMR(快速刷新)速度提高29%:在保存更改时进行更快的迭代内存使用量减少40%:在运行nextstart时测量优化的包导入:使用......
  • 央视新闻“潮涌号”直播车:远程星瀚H、远程超级VAN正式亮相
    9月23日,央视新闻推出《潮涌杭州亚运来了》大型融媒体节目,远程星瀚H、远程超级VAN作为央视潮涌号移动演播室用车、央视潮涌号金牌演播室用车正式亮相,并将驶向各大赛区、场馆,在行进中带领观众感受亚运脉搏。亚运赛事期间,远程星瀚H、远程超级VAN将为央视新闻提供全方位保障服务,以领先......
  • 关于一些《软件设计模式》的一些基础笔记
    ......
  • 观察者模式在事件驱动中的运用
    title:观察者模式在事件驱动中的运用categories:-Javatags:-设计模式abbrlink:53cb85e5date:2023-03-0215:06:28在面对一些较为复杂的业务时,合理的使用事件驱动设计,能够帮助我们对主业务逻辑和分支业务逻辑进行解耦,更好的实现开闭原则。什么是观察者模式?观察......