如何处理对象的状态变化?如何实现工厂模式?

ops/2024/12/23 16:09:19/
  1. 使用成员变量:可以在类中定义成员变量来表示对象的状态,通过修改这些成员变量的值来反映对象的状态变化。
  2. 封装状态修改操作:将修改状态的操作封装在成员函数中,确保状态的改变遵循一定的规则和逻辑,防止非法状态的出现。
  3. 使用状态模式:当对象的状态比较复杂,且状态之间的转换有较多逻辑时,可以考虑使用状态模式,将不同的状态封装为不同的类,将状态的切换逻辑封装在这些状态类中。

 使用状态模式的示例代码

#include <iostream>
#include <string>class State;  // 前向声明class Context {
private:State* currentState;
public:Context(State* state) : currentState(state) {}void setState(State* state) {currentState = state;}void request() {currentState->handle(this);}
};class State {
public:virtual ~State() {}virtual void handle(Context* context) = 0;
};class StateA : public State {
public:void handle(Context* context) override {std::cout << "State A handling" << std::endl;context->setState(new StateB());  // 状态转换}
};class StateB : public State {
public:void handle(Context* context) override {std::cout << "State B handling" << std::endl;context->setState(new StateA());  // 状态转换}
};int main() {Context context(new StateA());context.request();  // 调用状态 A 的处理context.request();  // 调用状态 B 的处理return 0;
}

 实现工厂模式

  1. 简单工厂模式:创建一个工厂类,该类包含一个静态函数,根据输入的参数创建不同类型的对象。
  2. 工厂方法模式:在基类中定义一个抽象的工厂方法,让子类实现该方法来创建具体的对象。
  3. 抽象工厂模式:创建一个抽象工厂类,其中包含多个抽象的工厂方法,每个工厂方法负责创建一种产品族的对象,具体工厂类实现这些方法。

 简单工厂模式的示例代码:        

#include <iostream>
#include <memory>
#include <string>class Product {
public:virtual ~Product() {}virtual void show() = 0;
};class ConcreteProductA : public Product {
public:void show() override {std::cout << "ConcreteProductA" << std::endl;}
};class ConcreteProductB : public Product {
public:void show() override {std::cout << "ConcreteProductB" << std::endl;}
};class SimpleFactory {
public:static std::unique_ptr<Product> createProduct(const std::string& type) {if (type == "A") {return std::make_unique<ConcreteProductA>();} else if (type == "B") {return std::make_unique<ConcreteProductB>();} else {return nullptr;}}
};int main() {auto productA = SimpleFactory::createProduct("A");if (productA) {productA->show();}auto productB = SimpleFactory::createProduct("B");if (productB) {productB->show();}return 0;
}

工厂方法模式的示例代码

#include <iostream>class Product {
public:virtual ~Product() {}virtual void show() = 0;
};class ConcreteProductA : public Product {
public:void show() override {std::cout << "ConcreteProductA" << std::endl;}
};class ConcreteProductB : public Product {
public:void show() override {std::cout << "ConcreteProductB" << std::endl;}
};class Creator {
public:virtual ~Creator() {}virtual Product* createProduct() = 0;
};class ConcreteCreatorA : public Creator {
public:Product* createProduct() override {return new ConcreteProductA();}
};class ConcreteCreatorB : public Creator {
public:Product* createProduct() override {return new ConcreteProductB();}
};int main() {Creator* creatorA = new ConcreteCreatorA();Product* productA = creatorA->createProduct();productA->show();delete productA;delete creatorA;Creator* creatorB = new ConcreteCreatorB();Product* productB = creatorB->createProduct();productB->show();delete productB;delete creatorB;return 0;
}

抽象工厂模式的示例代码

#include <iostream>class ProductA {
public:virtual ~ProductA() {}virtual void show() = 0;
};class ConcreteProductA1 : public ProductA {
public:void show() override {std::cout << "ConcreteProductA1" << std::endl;}
};class ConcreteProductA2 : public ProductA {
public:void show() override {std::cout << "ConcreteProductA2" << std::endl;}
};class ProductB {
public:virtual ~ProductB() {}virtual void show() = 0;
};class ConcreteProductB1 : public ProductB {
public:void show() override {std::cout << "ConcreteProductB1" << std::endl;}
};class ConcreteProductB2 : public ProductB {
public:void show() override {std::cout << "ConcreteProductB2" << std::endl;}
};class AbstractFactory {
public:virtual ~AbstractFactory() {}virtual ProductA* createProductA() = 0;virtual ProductB* createProductB() = 0;
};class ConcreteFactory1 : public AbstractFactory {
public:ProductA* createProductA() override {return new ConcreteProductA1();}ProductB* createProductB() override {return new ConcreteProductB1();}
};class ConcreteFactory2 : public AbstractFactory {
public:ProductA* createProductA() override {return new ConcreteProductA2();}ProductB* createProductB() override {return new ConcreteProductB2();}
};int main() {AbstractFactory* factory1 = new ConcreteFactory1();ProductA* productA1 = factory1->createProductA();ProductB* productB1 = factory1->createProductB();productA1->show();productB1->show();delete productA1;delete productB1;delete factory1;AbstractFactory* factory2 = new ConcreteFactory2();ProductA* productA2 = factory2->createProductA();ProductB* productB2 = factory2->createProductB();productA2->show();productB2->show();delete productA2;delete productB2;delete factory2;return 0;
}

 

 


http://www.ppmy.cn/ops/144329.html

相关文章

arXiv-2024 | 当视觉语言导航遇见自动驾驶!doScenes:基于自然语言指令的人车交互自主导航驾驶数据集

作者&#xff1a;Parthib Roy, Srinivasa Perisetla, Shashank Shriram, Harsha Krishnaswamy, Aryan Keskar, Ross Greer 单位&#xff1a;加州大学默塞德分校Mi实验室 原文链接&#xff1a;doScenes: An Autonomous Driving Dataset with Natural Language Instruction for…

127、SQLSERVE中union all 和union的使用场景

使用&#xff1a;在 SQL Server 中&#xff0c;UNION 和 UNION ALL 是用于合并两个或多个 SELECT 查询结果的操作符。两者区别union all 会去重&#xff0c;union 不会去重例子&#xff1a; 两张表&#xff1a;stu:stu_id,name emplyee:em_id,name 需求1&#xff1a;sql实…

设计模式-中介模式

背景&#xff08;与外观模式相似&#xff09; 智能家庭中包括各种设备&#xff1a;闹钟、咖啡机、电视机、窗帘。 主人要看电视时&#xff0c;执行以下操作&#xff1a;闹钟响起-》咖啡机做咖啡-》窗帘自动落下-》电视开始播放 传统思路&#xff1a; 闹钟类接收命令&#x…

八字精批API接口PHP实现返回json数据

引言 八字精批是根据个人的出生信息&#xff08;包括姓名、性别、出生年、月、日和时&#xff09;进行命理分析的重要工具。在中国传统文化中&#xff0c;八字命理被广泛应用于个人命运、性格分析以及未来发展的预测。本文将介绍一个八字精批的 API 接口&#xff0c;详细说明其…

leetcode之hot100---206环形链表(C++)

思路一&#xff1a;哈希表 遍历链表&#xff0c;同时借助哈希表判断当前遍历到的节点是否已经被访问过&#xff0c;如果当前节点已被访问过&#xff0c;则说明存在环 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* L…

WPF MVVM 数据表格DataGrid的表头Header无法进行数据绑定

话不多说&#xff0c;直接上案例代码&#xff0c;因为我也不知道为什么不能进行数据绑定。 DataGrid <DataGrid ColumnHeaderHeight"55"ItemsSource"{Binding BottomFormingMolds}" SelectedItem"{Binding SelectedItem3,ModeTwoWay}" …

在 .NET 5.0 运行 .NET 8.0 教程:使用 ASP.NET Core 创建 Web API

前言 因为我本机安装的是vs2019&#xff0c;所以我在使用vs创建项目的时候&#xff0c;只能选择.NET 5.0&#xff0c;而无法选择.NET 8.0 在网上有看到说用vs2019使用.net 8.0 &#xff0c;但是感觉不可靠&#xff0c;要用还是安装vs2022吧。 我因为不想要安装vs2022。 但是微…

半导体制造技术导论(第二版)萧宏 第十二章 化学机械研磨工艺

本章要求 1.列出化学机械研磨工艺的应用 化学机械研磨是一种移除工艺技术&#xff0c;结合化学反应和机械研磨去除沉积的薄膜&#xff0c;使表面更加平滑和平坦&#xff1b;也用于移除表面上大量的电介质薄膜&#xff0c;并在硅衬底上形成浅沟槽隔离STI&#xff1b;还可以从晶圆…