04:工厂模式——C++实现

目录

一、简介

二、应用场景

三、要点

四、样例

五、优缺点


一、简介

工厂模式(Factory Pattern:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决接口选择的问题。此模式的核心思想是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用以及方便后期维护拓展的目的。“工厂方法模式”是“简单工厂模式”的进一步抽象和推广。工厂模式基本和简单工厂模式差不多,简单工厂模式 - 在产品子类添加时,需要添加一个判断分支,这违背了开放-封闭原则。因此,工厂模式就是为了解决这个问题而产生的。

 

二、应用场景

当我们明确地计划不同条件下创建不同实例时。如:

1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。

2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。

3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。

 

三、要点

作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

 

四、样例

Factory(抽象工厂):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

ConcreteFactory(具体工厂):实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且被应用程序调用以创建产品对象。

Product(抽象产品):所创建对象的基类,也就是具体产品的共同父类或共同拥有的接口。

ConcreteProduct(具体产品):实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

 

1、创建抽象产品

// product.h
#ifndef PRODUCT_H
#define PRODUCT_H

#include <string>
using namespace std;

// 汽车接口
class ICar
{
public:
	virtual string Name() = 0;        // 汽车名称
};

#endif

2、创建具体产品

// concrete_product.h
#ifndef CONCRETE_PRODUCT_H
#define CONCRETE_PRODUCT_H

#include "product.h"

class BenzCar :public ICar
{
public:
	string Name() {
		return "Benz Car";
	}
};

class BMWCar :public ICar
{
public:
	string Name() {
		return "BMW Car";
	}
};

class AudiCar :public ICar
{
public:
	string Name() {
		return "Audi Car";
	}
};

#endif

3、创建抽象工厂

// factory.h
#ifndef FACTORY_H
#define FACTORY_H

#include "product.h"

// 工厂接口
class AFactory
{
public:
	virtual ICar* CreateCar() = 0;        // 生成汽车

};

#endif

4、创建具体工厂

// concrete_factory.h
#ifndef CONCRETE_FACTORY_H
#define CONCRETE_FACTORY_H

#include "factory.h"
#include "concrete_product.h"

class BenzFactory :public AFactory
{
public:
	ICar* CreateCar() {
		return new BenzCar();
	}
};

class BMWFactory :public AFactory
{
public:
	ICar* CreateCar() {
		return new BMWCar();
	}
};

class AudiFactory :public AFactory
{
public:
	ICar* CreateCar() {
		return new AudiCar();
	}
};

#endif

5、客户端程序

// concrete_factory.h
#ifndef CONCRETE_FACTORY_H
#define CONCRETE_FACTORY_H

#include "factory.h"
#include "concrete_product.h"

class BenzFactory :public AFactory
{
public:
	ICar* CreateCar() {
		return new BenzCar();
	}
};

class BMWFactory :public AFactory
{
public:
	ICar* CreateCar() {
		return new BMWCar();
	}
};

class AudiFactory :public AFactory
{
public:
	ICar* CreateCar() {
		return new AudiCar();
	}
};

#endif

6、输出:

Benz factory : Benz Car
Bmw factory : Bmw Car
Audi factory : Audi Car

五、优缺点

优点:

1、一个调用者想创建一个对象,只要知道其名称就可以了。

2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

3、屏蔽产品的具体实现,调用者只关心产品的接口。

 

缺点:

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
简单工厂模式: 简单工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在简单工厂模式中,我们创建对象而无需向客户端暴露创建逻辑。这种类型的设计模式属于创建型模式,提供了一种创建对象的最佳方式。 C++代码实现: ```c++ #include <iostream> using namespace std; // 抽象产品 class Product { public: virtual void Show() = 0; }; // 具体产品 A class ConcreteProductA : public Product { public: void Show() { cout << "ConcreteProductA Show" << endl; } }; // 具体产品 B class ConcreteProductB : public Product { public: void Show() { cout << "ConcreteProductB Show" << endl; } }; // 工厂类 class Factory { public: Product* CreateProduct(int type) { switch (type) { case 1: return new ConcreteProductA(); case 2: return new ConcreteProductB(); default: return nullptr; } } }; int main() { Factory factory; Product* productA = factory.CreateProduct(1); if (productA != nullptr) { productA->Show(); } Product* productB = factory.CreateProduct(2); if (productB != nullptr) { productB->Show(); } delete productA; delete productB; return 0; } ``` 抽象工厂模式: 抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或依赖对象的最佳方式。抽象工厂模式的基本思想是提供一个接口,用于创建与产品簇相关的一族对象,而不需要明确指定它们的类。 C++代码实现: ```c++ #include <iostream> using namespace std; // 抽象产品 A class AbstractProductA { public: virtual void Show() = 0; }; // 具体产品 A1 class ProductA1 : public AbstractProductA { public: void Show() { cout << "ProductA1 Show" << endl; } }; // 具体产品 A2 class ProductA2 : public AbstractProductA { public: void Show() { cout << "ProductA2 Show" << endl; } }; // 抽象产品 B class AbstractProductB { public: virtual void Show() = 0; }; // 具体产品 B1 class ProductB1 : public AbstractProductB { public: void Show() { cout << "ProductB1 Show" << endl; } }; // 具体产品 B2 class ProductB2 : public AbstractProductB { public: void Show() { cout << "ProductB2 Show" << endl; } }; // 抽象工厂 class AbstractFactory { public: virtual AbstractProductA* CreateProductA() = 0; virtual AbstractProductB* CreateProductB() = 0; }; // 具体工厂 1 class ConcreteFactory1 : public AbstractFactory { public: AbstractProductA* CreateProductA() { return new ProductA1(); } AbstractProductB* CreateProductB() { return new ProductB1(); } }; // 具体工厂 2 class ConcreteFactory2 : public AbstractFactory { public: AbstractProductA* CreateProductA() { return new ProductA2(); } AbstractProductB* CreateProductB() { return new ProductB2(); } }; int main() { AbstractFactory* factory = new ConcreteFactory1(); AbstractProductA* productA = factory->CreateProductA(); AbstractProductB* productB = factory->CreateProductB(); productA->Show(); productB->Show(); delete productA; delete productB; factory = new ConcreteFactory2(); productA = factory->CreateProductA(); productB = factory->CreateProductB(); productA->Show(); productB->Show(); delete productA; delete productB; delete factory; return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幻欢子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值