设计模式——工厂模式及简单实现

工厂模式

1. 意图

  1. 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类。
  2. 使其创建过程延迟到子类进行。

2. 适用场景

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类指定它所创建的对象的时候。

3. 应用实例

  1. 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
  2. 汽车工厂:用户可以选择法拉利还是玛莎拉蒂而不用关心汽车的具体实现。

4. 类图

1.png

说明

通过ConcreteCreator,我们可以根据自己的需要选择实例化的Product

4. 优点

  • 一个调用者想创建一个对象,只要知道其名称就可以了。
  • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
  • 屏蔽产品的具体实现,调用者只关心产品的接口。

5. 实现

Person.h

#ifndef FACTORY_METHOD_PERSON_H
#define FACTORY_METHOD_PERSON_H

#include <iostream>

class Person {
public:
    virtual void doThings();
};

class Teacher : public Person {
public:
    void doThings() override;
};

class Coder : public Person {
public:
    void doThings() override;
};

#endif //FACTORY_METHOD_PERSON_H

Person.cpp

#include "Person.h"

using std::cout;
using std::endl;

void Person::doThings() {

}

void Teacher::doThings() {
    cout << "教书" << endl;
}

void Coder::doThings() {
    cout << "写代码" << endl;
}

main.cpp

#include "Person.h"
#include <string>

using std::string;

class Factory {
public:
    Person *getPerson(const string &type) {
        if (type == "Teacher")
            return new Teacher();
        else if (type == "Coder")
            return new Coder();
        else
            return nullptr;
    }
};

int main() {
    Factory factory;
    Person *p;

    p = factory.getPerson("Teacher");
    p->doThings();
    p = factory.getPerson("Coder");
    p->doThings();

    return 0;
}
执行结果
教书
写代码

这里的Person类相当于抽象的Product(即产品),而TeacherCoderPerson的具体实现(即具体产品),通过FactorygetPerson方法,我们可以根据具体的Type返回相应的类实例。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值