栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

04 C++设计模式之抽象工厂(Abstract Factory)模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

04 C++设计模式之抽象工厂(Abstract Factory)模式

抽象工厂模式定义

抽象工厂是一种创建型设计模式,它能创建一系列相关的对象,而无需指定其具体类。

抽象工厂模式优缺点 优点
  • 你可以确保同一工厂生成的产品相互匹配。
  • 你可以避免客户端和具体产品代码的耦合。
  • 单一职责原则。你可以将产品生成代码抽取到同一位置,使得代码易于维护。
  • 开闭原则。向应用程序中引入新产品变体时,你无需修改客户端代码。
缺点
  • 由于采用该模式需要向应用中引入众多接口和类,代码可能会比之前更加复杂
抽象工厂模式结构与实现 结构
  • 抽象产品(Abstract Product)为构成系列产品的一组不同但相关的产品声明接口。
  • 具体产品(Concrete Product)是抽象产品的多种不同类型实现。所有变体(维多利亚/现代)都必须实现相应的抽象产品(椅子/沙发)。
  • 抽象工厂(Abstract Factory)接口声明了一组创建各种抽象产品的方法。
  • 具体工厂(Concrete Factory)实现抽象工厂的构建方法。每个具体工厂都对应特定产品变体,且仅创建此种产品变体。
实例

AbstractProduct.h:

#ifndef  ABSTRACT_PRODUCT_H_
#define  ABSTRACT_PRODUCT_H_

#include 

// 抽象产品类 电影
class Movie {
 public:
    virtual std::string showMovieName() = 0;
};

// 抽象产品类 书籍
class Book {
 public:
    virtual std::string showBookName() = 0;
};

#endif  // ABSTRACT_PRODUCT_H_

AbstractFactory.h:

#ifndef  ABSTRACT_FACTORY_H_
#define  ABSTRACT_FACTORY_H_

#include 
#include "AbstractProduct.h"

// 抽象工厂类 生产电影和书籍类等
class Factory {
 public:
    virtual std::shared_ptr productMovie() = 0;
    virtual std::shared_ptr productBook() = 0;
};

#endif  // ABSTRACT_FACTORY_H_

ConcreteProduct.h:

#ifndef  CONCRETE_PRODUCT_H_
#define  CONCRETE_PRODUCT_H_

#include 
#include 
#include "AbstractProduct.h"

// 具体产品类 电影::国产电影
class ChineseMovie : public Movie {
    std::string showMovieName() override {
        return "《让子弹飞》";
    }
};

// 具体产品类 电影::日本电影
class JapaneseMovie : public Movie {
    std::string showMovieName() override {
        return "《千与千寻》";
    }
};

// 具体产品类 书籍::国产书籍
class ChineseBook : public Book {
    std::string showBookName() override {
        return "《三国演义》";
    }
};

// 具体产品类 书籍::日本书籍
class JapaneseBook : public Book {
    std::string showBookName() override {
        return "《白夜行》";
    }
};

#endif  // CONCRETE_PRODUCT_H_
#ifndef CONCRETE_FACTORY_H_
#define CONCRETE_FACTORY_H_

#include 
#include "AbstractFactory.h"
#include "ConcreteProduct.h"

// 具体工厂类 中国生产者
class ChineseProducer : public Factory {
 public:
    std::shared_ptr productMovie() override {
        return std::make_shared();
    }

    std::shared_ptr productBook() override {
        return std::make_shared();
    }
};

// 具体工厂类 日本生产者
class JapaneseProducer : public Factory {
 public:
    std::shared_ptr productMovie() override {
        return std::make_shared();
    }

    std::shared_ptr productBook() override {
        return std::make_shared();
    }
};

#endif  // CONCRETE_FACTORY_H_

main.cpp

#include 
#include "AbstractFactory.h"
#include "ConcreteFactory.h"


int main() {
    
    system("chcp 65001");
    std::shared_ptr factory;

    // 这里假设从配置中读到的是China(运行时决定的)
    std::string conf = "China";

    // 程序根据当前配置或环境选择创建者的类型
    if (conf == "China") {
        factory = std::make_shared();
    } else if (conf == "Japan") {
        factory = std::make_shared();
    } else {
        std::cout << "error conf" << std::endl;
    }

    std::shared_ptr movie;
    std::shared_ptr book;
    movie = factory->productMovie();
    book = factory->productBook();
    std::cout << "获取一部电影: " << movie->showMovieName() << std::endl;
    std::cout << "获取一本书: " << book->showBookName() << std::endl;
    system("pause");
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019457.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号