解释工厂模式

embedded/2024/12/20 7:17:07/

参考文献:C++几种工厂模式和实现实例_工厂方法模式c++实例-CSDN博客

什么是工厂模式

工厂模式是一种创建对象的设计模式,它提供了一种创建对象的方式,将对象的创建和使用分离

通过工厂模式,可以根据不同的条件创建不同类型的对象,而不需要在客户端代码中显示地指出具体地对象类型

简单工厂

特点:简单工厂模式定义了一个工厂类,通过工厂类的静态方法来创建不同的对象

优点:使用者只需要知道工厂类的名称和参数,不需要了解具体的构造过程

缺点:增加新产品时需要修改工厂类,违反了开闭原则(对扩展开放,对修改关闭)

#include<iostream>
using namespace std;class Shape {
public:virtual void draw() = 0;
};
class Cricle :public Shape {
public:void draw() {cout << "draw cricle" << endl;}
};
class Rectangle :public Shape {
public:void draw() {cout << "draw rectangle" << endl;}
};
class ShapeFactory {
public:static Shape* createFactory(string shapeType) {if (shapeType == "Cricle") {return new Cricle();}else if (shapeType == "Rectangle") {return new Rectangle();}return NULL;}
};
int main() {Shape* s=ShapeFactory::createFactory("Cricle");s->draw();s = ShapeFactory::createFactory("Rectangle");s->draw();return 0;}

工厂方法模式

特点:工厂方法模式将对象的创建延迟到子类中,每一个具体产品对应一个具体工厂

优点:增加新产品时,只需增加一个具体工厂类,不需要修改工厂类,符合开闭原则

缺点:类的数量增加,使系统更加麻烦

#include<iostream>
using namespace std;class Shape {
public:virtual void draw() = 0;
};
class Cricle :public Shape {
public:void draw() {cout << "draw cricle" << endl;}
};
class Rectangle :public Shape {
public:void draw() {cout << "draw rectangle" << endl;}
};
class ShapeFactory {
public:virtual Shape* creatFactory() = 0;};
class CricleFactory :public ShapeFactory {Shape* creatFactory() {return new Cricle;}
};
class RectangleFactory :public ShapeFactory {Shape* creatFactory() {return new Rectangle;}
};
int main() {ShapeFactory* s = new CricleFactory;Shape* sp = s->creatFactory();sp->draw();return 0;}

抽象工厂模式

特点:工厂方法模式将对象的创建延迟到子类中,每一个具体产品对应一个具体工厂

优点:增加新产品时,只需增加一个具体工厂类,不需要修改工厂类,符合开闭原则

缺点:类的数量增加,使得系统更加复杂

//假设我们要创建一个图形用户界面(GUI)工厂,它可以创建不同风格(如 Windows 风格和 Mac 风格)的按钮和文本框。
#include<iostream>
using namespace std;
class Button {
public:virtual void show() = 0;
};
class Text {
public:virtual void show() = 0;
};
class WindowsButton : public Button {
public:void show()  {cout << "Windows button." << endl;}
};
class MacButton : public Button {
public:void show()  {cout << "Mac button." << endl;}
};
class WindowsText : public Text {
public:void show()  {cout << "Windows text." << endl;}
};
class MacText : public Text {
public:void show() {cout << "Mac text." << endl;}
};
class Factory {
public:virtual Button* createButton() = 0;virtual Text* createText() = 0;
};
class WindowFactory :public Factory {
public:Button* createButton() {return new WindowsButton;}Text* createText() {return new WindowsText;}
};
class MacFactory :public Factory {
public:Button* createButton() {return new MacButton;}Text* createText() {return new MacText;}
};int main() {WindowFactory w;Button* b=w.createButton();b->show();return 0;}

简单工厂模式:适用于产品种类不多且不频繁变动的场景,但不符合开闭原则

工厂方法模式:适用于产品种类多且经常变动的场景,每增加一个产品只需要增加一个对应的工厂,符合开闭原则

抽象工厂模式:适用于创建一系列相互依赖的产品对象的场景,但增加新的产品族时,改动大,符合开闭原则


http://www.ppmy.cn/embedded/147212.html

相关文章

快消品 B2B 困境与破局:基于 2+1 链动模式与 S2B2C 商城小程序的思考

摘要&#xff1a;本文深入剖析了快消品 B2B 行业面临的困境&#xff0c;包括诸多平台的衰落以及在用户端、品牌商、中间商和零售小店多方面遭遇的阻碍&#xff0c;揭示其脱离 C 端用户、缺乏各方支持而陷入“姥姥不疼&#xff0c;舅舅不爱”的尴尬处境。在此基础上&#xff0c;…

uni-app创建微信小程序

UniApp 是一个基于 Vue.js 语法的跨平台开发框架&#xff0c;它允许开发者使用一套代码构建适用于 iOS 、 Android 、 Web 以及各种小程序和快应用的应用程序 一、环境搭建 安装使用教程&#xff1a;https://blog.csdn.net/YuanFudao/article/details/132384692 二、项目基本…

SpringBoot 整合 SQLite 数据库

1、SQLite 简介 SQLite 是一个很轻量的关系型数据库&#xff0c;不需要安装服务&#xff0c;数据存储在文件里。 2、引入pom依赖 <!-- SQLite --><dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><v…

React 组件间的通信

React 父传子 实现&#xff1a; function Son(props){return <div>{ props.name }</div> } ​ ​ function App(){const name this is app namereturn (<div><Son name{name}/></div>) } 注意&#xff1a;这里可以传递任何类型&#xff0c;…

Flutter环境搭建

1.Flutter 简介 1.1 Flutter 是什么 &#xff1f; Flutter 是一个 UI SDK&#xff08;Software Development Kit&#xff09;跨平台解决方案&#xff1a;可以实现一套代码发布移动端&#xff08;iOS、Android、HarmonyOS&#xff09;、Web端、桌面端目前很多公司都在用它&…

第47节 ArkTS 创建自定义组件

在 ArkTS 中创建自定义组件是一个相对简单但功能强大的过程。以下是如何在 ArkTS 中创建和使用自定义组件的详细步骤&#xff1a; 一、定义自定义组件 1. 使用Component注解&#xff1a;为了注册一个组件&#xff0c;使其能够在其他文件中被引用&#xff0c;你需要使用Com…

2024 年最新前端ES-Module模块化、webpack打包工具详细教程(更新中)

模块化概述 什么是模块&#xff1f;模块是一个封装了特定功能的代码块&#xff0c;可以独立开发、测试和维护。模块通过导出&#xff08;export&#xff09;和导入&#xff08;import&#xff09;与其他模块通信&#xff0c;保持内部细节的封装。 前端 JavaScript 模块化是指…

thinkphp:try-catch捕获异常

使用简单的例子&#xff0c;实现了一个简单的try-catch捕获异常的实例 //开始事务Db::startTrans(); try{ //有异常抛出异常 if(存在错误){ throw new \Exception("异常信息"); } // 提交事务 Db::commit(); // 返回成功信息 ... } catch (\…