为什么需要抽象工厂模式?
有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。
类图
抽象工厂模式包含如下角色:
- AbstractProduct:抽象产品
- Product:具体产品
- AbstractFactory:抽象工厂
- ConcreteFactory:具体工厂
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xn8BS5ez-1648131194765)(asset/image-20220324220458492.png)]](https://i-blog.csdnimg.cn/blog_migrate/f1c55b62eeb253707f42a961e049a1e3.png)
时序图
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bsq0bqAC-1648131194768)(asset/image-20220324220233428.png)]](https://i-blog.csdnimg.cn/blog_migrate/9061f0e4aa68a0ed04a57cde1b083e6c.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;
}
本文探讨了抽象工厂模式的必要性,通过实例展示了如何创建一个能够根据不同配置动态生成电影和书籍产品的系统。它允许在运行时灵活选择并创建不同类型的抽象产品,如中国电影、日本电影和书籍。

被折叠的 条评论
为什么被折叠?



