首页 > 其他分享 >简单工厂模式、工厂模式、抽象工厂模式

简单工厂模式、工厂模式、抽象工厂模式

时间:2024-05-28 16:24:00浏览次数:19  
标签:std use return 模式 工厂 抽象 unique public

工厂模式(Factory Pattern)是一种创建对象的设计模式,它提供了一种方法来将对象的创建过程与对象的使用过程分离。工厂模式在软件开发中有广泛的应用,适用于不同的场景和需求。下面是几种常见的工厂模式及其应用场景:

1. 简单工厂模式(Simple Factory Pattern)

简单工厂模式通过一个工厂类来创建对象,根据不同的输入参数返回不同的类的实例。

应用场景:

  • 对象创建逻辑简单:当对象的创建逻辑相对简单,且不需要复杂的初始化时,可以使用简单工厂模式。
  • 减少客户端依赖:客户端只需依赖工厂类,而不需要依赖具体的实现类,降低了耦合性。

示例代码:

#include <iostream>
#include <memory>

class Product {
public:
    virtual void use() = 0;
    virtual ~Product() = default;
};

class ConcreteProductA : public Product {
public:
    void use() override {
        std::cout << "Using Product A" << std::endl;
    }
};

class ConcreteProductB : public Product {
public:
    void use() override {
        std::cout << "Using Product B" << std::endl;
    }
};

class SimpleFactory {
public:
    static std::unique_ptr<Product> createProduct(char type) {
        if (type == 'A') {
            return std::make_unique<ConcreteProductA>();
        } else if (type == 'B') {
            return std::make_unique<ConcreteProductB>();
        } else {
            return nullptr;
        }
    }
};

int main() {
    auto product = SimpleFactory::createProduct('A');
    if (product) {
        product->use();
    }

    product = SimpleFactory::createProduct('B');
    if (product) {
        product->use();
    }

    return 0;
}

2. 工厂方法模式(Factory Method Pattern)

工厂方法模式通过定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

应用场景:

  • 对象创建复杂:当对象的创建过程比较复杂,需要在子类中定制时,可以使用工厂方法模式。
  • 增加新产品:当需要增加新产品时,只需添加新的工厂类,不需要修改已有代码,符合开闭原则。

示例代码:

#include <iostream>
#include <memory>

class Product {
public:
    virtual void use() = 0;
    virtual ~Product() = default;
};

class ConcreteProductA : public Product {
public:
    void use() override {
        std::cout << "Using Product A" << std::endl;
    }
};

class ConcreteProductB : public Product {
public:
    void use() override {
        std::cout << "Using Product B" << std::endl;
    }
};

class Creator {
public:
    virtual std::unique_ptr<Product> factoryMethod() const = 0;
    virtual ~Creator() = default;
};

class ConcreteCreatorA : public Creator {
public:
    std::unique_ptr<Product> factoryMethod() const override {
        return std::make_unique<ConcreteProductA>();
    }
};

class ConcreteCreatorB : public Creator {
public:
    std::unique_ptr<Product> factoryMethod() const override {
        return std::make_unique<ConcreteProductB>();
    }
};

int main() {
    std::unique_ptr<Creator> creatorA = std::make_unique<ConcreteCreatorA>();
    auto productA = creatorA->factoryMethod();
    productA->use();

    std::unique_ptr<Creator> creatorB = std::make_unique<ConcreteCreatorB>();
    auto productB = creatorB->factoryMethod();
    productB->use();

    return 0;
}

3. 抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式提供一个接口,用于创建一系列相关或互相依赖的对象,而无需指定它们具体的类。

应用场景:

  • 产品族:当需要创建一组相关的或相互依赖的对象时,可以使用抽象工厂模式。
  • 平台独立:当系统需要独立于产品的创建和表示时,可以使用抽象工厂模式。

示例代码:

#include <iostream>
#include <memory>

// Abstract Product A
class AbstractProductA {
public:
    virtual void use() = 0;
    virtual ~AbstractProductA() = default;
};

class ConcreteProductA1 : public AbstractProductA {
public:
    void use() override {
        std::cout << "Using Product A1" << std::endl;
    }
};

class ConcreteProductA2 : public AbstractProductA {
public:
    void use() override {
        std::cout << "Using Product A2" << std::endl;
    }
};

// Abstract Product B
class AbstractProductB {
public:
    virtual void use() = 0;
    virtual ~AbstractProductB() = default;
};

class ConcreteProductB1 : public AbstractProductB {
public:
    void use() override {
        std::cout << "Using Product B1" << std::endl;
    }
};

class ConcreteProductB2 : public AbstractProductB {
public:
    void use() override {
        std::cout << "Using Product B2" << std::endl;
    }
};

// Abstract Factory
class AbstractFactory {
public:
    virtual std::unique_ptr<AbstractProductA> createProductA() const = 0;
    virtual std::unique_ptr<AbstractProductB> createProductB() const = 0;
    virtual ~AbstractFactory() = default;
};

// Concrete Factory 1
class ConcreteFactory1 : public AbstractFactory {
public:
    std::unique_ptr<AbstractProductA> createProductA() const override {
        return std::make_unique<ConcreteProductA1>();
    }
    std::unique_ptr<AbstractProductB> createProductB() const override {
        return std::make_unique<ConcreteProductB1>();
    }
};

// Concrete Factory 2
class ConcreteFactory2 : public AbstractFactory {
public:
    std::unique_ptr<AbstractProductA> createProductA() const override {
        return std::make_unique<ConcreteProductA2>();
    }
    std::unique_ptr<AbstractProductB> createProductB() const override {
        return std::make_unique<ConcreteProductB2>();
    }
};

int main() {
    std::unique_ptr<AbstractFactory> factory1 = std::make_unique<ConcreteFactory1>();
    auto productA1 = factory1->createProductA();
    auto productB1 = factory1->createProductB();
    productA1->use();
    productB1->use();

    std::unique_ptr<AbstractFactory> factory2 = std::make_unique<ConcreteFactory2>();
    auto productA2 = factory2->createProductA();
    auto productB2 = factory2->createProductB();
    productA2->use();
    productB2->use();

    return 0;
}

小结

  • 简单工厂模式:适用于对象创建逻辑简单,减少客户端依赖的场景。
  • 工厂方法模式:适用于对象创建复杂,需要在子类中定制,以及需要增加新产品的场景。
  • 抽象工厂模式:适用于创建一组相关或相互依赖的对象,以及系统需要独立于产品的创建和表示的场景。

根据具体的需求选择合适的工厂模式,可以提高代码的可维护性和扩展性。

标签:std,use,return,模式,工厂,抽象,unique,public
From: https://www.cnblogs.com/whcjob/p/18218277

相关文章

  • 仓储未来已来:揭秘3D可视化工厂园区的魅力与实力
    在快节奏的现代生活中,物流仓储行业扮演着至关重要的角色。随着科技的飞速发展,传统仓储模式正面临一场前所未有的变革。今天,就让我们一起看看3D可视化技术如何为物流行业带来前所未有的便利与效率。 什么是3D可视化工厂园区?3D可视化工厂园区,就是将传统的仓储工厂园区通过先进的......
  • 工厂方法模式(Factory Method Pattern)
    工厂方法模式(FactoryMethodPattern)是一种创建型设计模式,它在父类中提供一个创建对象的方法,允许子类决定实例化哪一个类。工厂方法模式将对象的实例化推迟到子类中进行,使得系统在不修改原有代码的情况下可以扩展,从而实现了开闭原则(对扩展开放,对修改关闭)模式结构抽象工厂(Abstr......
  • 抽象工厂模式(Abstract Factory)
    抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,它提供了一种方式,将一组具有共同主题的单独的工厂封装起来,而不需要指定它们的具体类。抽象工厂模式允许客户端在不指定具体类的情况下创建一系列相互关联或相互依赖的产品族。模式结构抽象工厂模式包含以下角色:抽象......
  • 单例模式(Singleton)
    单例模式(SingletonPattern)是设计模式中最简单也最常见的一种。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在单例模式中,一个类只有一个实例存在,同时该类的实例由一个预先定义好的静态引用变量所持有,以便在整个系统中随时访问它。模式结构与角色单例类......
  • 装饰器模式(Decorator)
    装饰器模式(DecoratorPattern)是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责(即增加其功能),就增加功能来说,装饰器模式相比生成子类更为灵活。装饰器模式是一种对象结构型模式,在其结构图中含有一个作为抽象构件(Component)角色的接口和多个实现了该接口的抽象装饰类......
  • 设计模式概要
    常见的5中设计模式1.但通常所说的“23种设计模式”是指那些在实践中被广泛认可和使用的设计模式。这些设计模式可以分为以下三类:创建型模式(CreationalPatterns):用于处理对象的创建机制,以提高系统的灵活性和可重用性。单例模式(Singleton):确保一个类只有一个实例,并提供一个全局......
  • 设计模式大纲
    设计模式大纲设计模式(DesignPattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式可以提高代码的可读性、可扩展性、可靠性和可测试性。设计模式是软件工程中常用的一种软件设计原则,它是一套被反复使用、多数人知晓的、经过分类的、代码设计......
  • 第一章 设计模式、UML图、软件设计原则
    本系列博客主要参考黑马程序员的Java设计模式详解视频教程1.设计模式概述1.1软件设计模式的概念软件设计模式(SoftwareDesignPattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生......
  • nginx 配置 vue History模式
    解决需要加一行try_files$uri$uri//index.html;,其中/index.html是你自己的目录中的入口文件server{listen[::]:80default_server;#root/var/www/html;#Addindex.phptothelistifyouareusingPHPindexindex.htmlindex......
  • 构建未来|进击的元宇宙模式,打破线上线下界限
     元宇宙是指由虚拟世界、数字孪生和现实世界三个核心元素构成的综合体,具有高度沉浸和交互性,可以提供更为广泛和多样化的虚拟体验,并在现实中影响和塑造人们的生活。如今,随着科技不断发展,VR/AR、区块链、AI等众多技术的逐个成熟,元宇宙开始与现实世界紧密融合,元宇宙开发是指在元......