抽象工厂是一种创建型设计模式,它能创建一系列相关的对象,而无需指定其具体类。
抽象工厂模式优缺点 优点- 你可以确保同一工厂生成的产品相互匹配。
- 你可以避免客户端和具体产品代码的耦合。
- 单一职责原则。你可以将产品生成代码抽取到同一位置,使得代码易于维护。
- 开闭原则。向应用程序中引入新产品变体时,你无需修改客户端代码。
- 由于采用该模式需要向应用中引入众多接口和类,代码可能会比之前更加复杂
- 抽象产品(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"); }



