解释工厂模式

devtools/2024/12/25 0:38:12/

参考文献: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/devtools/145121.html

相关文章

【模型压缩】原理及实例

在移动智能终端品类越发多样的时代&#xff0c;为了让模型可以顺利部署在算力和存储空间都受限的移动终端&#xff0c;对模型进行压缩尤为重要。模型压缩&#xff08;model compression&#xff09;可以降低神经网络参数量&#xff0c;减少延迟时间&#xff0c;从而实现提高神经…

Spring Boot框架结合MongoDB实现日志数据的保存和归档

使用Spring Boot框架结合MongoDB实现日志数据的保存和归档&#xff0c;可以考虑以下几个关键点&#xff1a; 关键点概述 1&#xff09; 数据库设计&#xff1a; 数据模型&#xff1a;确定你的日志记录所需的字段&#xff0c;如时间戳、日志级别、消息内容、用户ID等。索引&…

【DOCKER】基于DOCKER的服务之DUFS

文件上传下载服务器&#xff1a;https://github.com/sigoden/dufs # 拉取镜像 docker pull sigoden/dufs# 创建数据卷文件夹 mkdir -p /data/.docker/volumes/dufs# 创建容器 docker run -id --restartalways --name dufs \-p 51080:5000 \-v /data/.docker/volumes/dufs:/dat…

【漏洞-Oracle】未设置口令复杂度校验、密码有效期

1.场景描述 三方漏洞扫描&#xff1a; 2.详细描述 安全问题&#xff1a;Oracle未设置系统的口令复杂度校验、密码有效期。 危害分析结果&#xff1a;存在使用口令被恶意用户猜测获得&#xff0c;合法用户身份被仿冒&#xff0c;导致系统被非授权访问的可能性。 整改建议&…

WPF 依赖属性和附加属性

除了普通的 CLR 属性&#xff0c; WPF 还有一套自己的属性系统。这个系统中的属性称为依赖属性。 1. 依赖属性 为啥叫依赖属性&#xff1f;不叫阿猫阿狗属性&#xff1f; 通常我们定义一个普通 CLR 属性&#xff0c;其实就是获取和设置一个私有字段的值。假设声明了 100 个 …

leetcode hot100 轮转数组

189. 轮转数组 已解答 中等 相关标签 相关企业 提示 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮…

homebrew,gem,cocoapod 换源,以及安装依赖

安装homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 再按照成功提示配置环境变量 ruby 更新ruby到最新 brew install ruby 如果安装了会自动升级 安装完成后根据提示配置环境变量 再执行命令使其生效 s…

基于Spring Boot的找律师系统

一、系统背景与意义 在现代社会&#xff0c;法律服务的需求日益增长&#xff0c;但传统寻找律师的方式往往存在信息不透明、选择困难等问题。基于Spring Boot的找律师系统旨在解决这些问题&#xff0c;通过线上平台&#xff0c;用户可以轻松搜索、比较和选择合适的律师&#x…