设计模式
单例模式
-
- 私有构造函数,防止外部直接实例化
- 静态成员函数,返回唯一实例的引用
- 静态局部变量,在程序生命周期内
#include<iostream>
#include<map>
using namespace std;class shoppingCartManager {
public:// 获取购物车实例// 2. 静态成员函数, 返回唯一实例的引用static shoppingCartManager& getInstance(){static shoppingCartManager instance;// 3. 静态局部变量,在程序生命周期内只被创建一次,因此,每次调用getInstance,都返回相同的实例return instance;}void addToChart(const string& itemName, int quantity) {cart[itemName] += quantity;}void viewCart() const {for (const auto& item : cart) {cout << item.first << "" << item.second << endl;}}private:// 1, 私有构造函数,防止外部直接实例化shoppingCartManager() {}map<string, int>cart;
};int main() {string itemName;int quantity;shoppingCartManager& ca = shoppingCartManager::getInstance();ca.addToChart("aaa", 3);while (cin >> itemName >> quantity) {if (itemName == "end") break;shoppingCartManager& cart = shoppingCartManager::getInstance();cart.addToChart(itemName, quantity);}const shoppingCartManager& cart = shoppingCartManager::getInstance();cart.viewCart();return 0;
}
工厂模式
-
对类内部数据的只读访问
const vector<Block*> & getBlocks() const{return blocks; }
-
创建型设计模式,引入抽象类和具体类
-
一个工厂方法可以创建一个具体产品
#include <iostream>
#include <vector>using namespace std;// 抽象积木接口
class Block {
public:virtual void produce() = 0;
};// 具体圆形积木实现
class CircleBlock :public Block {
public:void produce() override {cout << "Circle Block." << endl;}
};// 具体方形积木实现
class SquareBlock : public Block {
public:void produce() override {cout << "Square Block." << endl;}
};// 抽象积木工厂接口
class BlockFactory {
public:virtual Block* createBlock() = 0;
};// 具体圆形积木实现
class CircleFactory : public BlockFactory {
public:Block* createBlock() override {return new CircleBlock();}
};// 具体方形积木实现
class SquareFactory : public BlockFactory {
public:Block* createBlock() override {return new SquareBlock();}
};// 积木工厂系统
class BlockFactorySystem {
private:vector<Block*> blocks;
public:void produceBlocks(BlockFactory* factory, int quantity) {for (int i = 0; i < quantity; i++) {Block* block = factory->createBlock();blocks.push_back(block);block->produce();}}// 对类内部数据的只读访问const vector<Block*>& getBlocks() const {return blocks;}~BlockFactorySystem() {for (Block* block : blocks) {delete block;}}
};int main() {BlockFactorySystem factorySystem;int productionCount;cin >> productionCount;for (int i = 0; i < productionCount; i++) {string blockType;int quantity;cin >> blockType >> quantity;if (blockType == "Circle") {factorySystem.produceBlocks(new CircleFactory(), quantity);}else {factorySystem.produceBlocks(new SquareFactory(), quantity);}}const vector<Block*>& blocks = factorySystem.getBlocks();for (auto& block : blocks) {block->produce();}return 0;
}
抽象工厂模式
- 一个工厂方法可以创建一类具体产品
- 应用场景:使用抽象工厂模式来创建不同数据库的连接对象
#include <iostream>
#include <string>using namespace std;// 抽象椅子类
class Chair {
public:virtual void showInfo() = 0;
};class ModernChair : public Chair {
public:void showInfo()override {cout << "modern chair" << endl;}
};class ClassicalChair : public Chair {void showInfo() override {cout << "classical chair" << endl;}
};class Sofa {
public:virtual void displayInfo() = 0;
};class ModernSofa : public Sofa {
public:void displayInfo() override{cout << "display sofa" << endl;}
};class ClassicalSofa : public Sofa {
public:void displayInfo() override {cout << "classical sofa" << endl;}
};// 抽象家具工厂接口
class furnitureFactory {
public:virtual Chair* createChair() = 0;virtual Sofa* createSofa() = 0;
};// 现代家具工厂接口
class ModernFurnitureFactory : public furnitureFactory {
public:Chair* createChair() override {return new ModernChair();}Sofa* createSofa() override {return new ModernSofa();}
};// 传统家具工厂接口
class ClassicalFunitureFactory : public furnitureFactory {
public:Chair* createChair() override {return new ClassicalChair();}Sofa* createSofa() override {return new ClassicalSofa();}
};int main() {int N;cin >> N;for (int i = 0; i < N; i++) {string furnitureType;cin >> furnitureType;furnitureFactory* factory = nullptr;if (furnitureType == "Modern") {factory = new ModernFurnitureFactory();}else if (furnitureType == "Classical") {factory = new ClassicalFunitureFactory();}Chair* chair = factory->createChair();Sofa* sofa = factory->createSofa();chair->showInfo();sofa->displayInfo();delete chair;delete sofa;delete factory;}return 0;
}