创建型——抽象工厂模式C++实现

相比于工厂方法模式,抽象工厂模式每个工厂可以生产多种产品(比如电影和书籍)。

实例

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_FACTORY_H_
#define CONCRETE_FACTORY_H_

#include <memory>
#include "AbstractFactory.h"
#include "ConcreteProduct.h"

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

    std::shared_ptr<Book> ProductBook() override {
        return std::make_shared<ChineseBook>();
    }
};

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

    std::shared_ptr<Book> ProductBook() override {
        return std::make_shared<JapaneseBook>();
    }
};

#endif  // CONCRETE_FACTORY_H_

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_

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;
    return 0;
}

编译运行:

$g++ -g main.cpp -o abstractfactory -std=c++11
$./abstractfactory 
获取一部电影: 《让子弹飞》
获取一本书: 《三国演义》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值