2、创建型模式——抽象工厂模式

本文探讨了抽象工厂模式的必要性,通过实例展示了如何创建一个能够根据不同配置动态生成电影和书籍产品的系统。它允许在运行时灵活选择并创建不同类型的抽象产品,如中国电影、日本电影和书籍。

为什么需要抽象工厂模式?

有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。

类图

抽象工厂模式包含如下角色:

  • AbstractProduct:抽象产品
  • Product:具体产品
  • AbstractFactory:抽象工厂
  • ConcreteFactory:具体工厂

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xn8BS5ez-1648131194765)(asset/image-20220324220458492.png)]

时序图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bsq0bqAC-1648131194768)(asset/image-20220324220233428.png)]

代码

AbstractProduct.h

#ifndef  ABSTRACT_PRODUCT_H_
#define  ABSTRACT_PRODUCT_H_
#include <string>

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

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

ConcreteProduct.h

#ifndef  CONCRETE_PRODUCT_H_
#define  CONCRETE_PRODUCT_H_

#include <iostream>
#include <string>
#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_

AbstractFactory.h

#ifndef  ABSTRACT_FACTORY_H_
#define  ABSTRACT_FACTORY_H_

#include <memory>
#include "AbstractProduct.h"

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

#endif  // ABSTRACT_FACTORY_H_

ConcreteFactory.h

#ifndef  CONCRETE_PRODUCT_H_
#define  CONCRETE_PRODUCT_H_

#include <iostream>
#include <string>
#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_

main.cpp

#include <iostream>
#include "AbstractFactory.h"
#include "ConcreteFactory.h"


int main() 
{
    std::shared_ptr<Factory> factory;
    // 这里假设从配置中读到的是Chinese(运行时决定的)
    std::string conf = "China";

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

    std::shared_ptr<Movie> movie;
    std::shared_ptr<Book> book;
    movie = factory->productMovie();
    book = factory->productBook();
    std::cout << "获取一部电影: " << movie->showMovieName() << std::endl;
    std::cout << "获取一本书: " << book->showBookName() << std::endl;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值