【C++设计模式二】C++工厂模式

(1)定义

简单工厂模式中,每新增一个具体产品,就需要修改工厂类内部的判断逻辑。为了不修改工厂类,遵循开闭原则,工厂方法模式中不再使用工厂类统一创建所有的具体产品,而是针对不同的产品设计了不同的工厂,每一个工厂只生产特定的产品。
定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

(2)结构

工厂模式结构如下:

  • 抽象工厂(AbstractFactory):所有生产具体产品的工厂类的基类,提供工厂类的公共方法;
  • 具体工厂(ConcreteFactory):生产具体的产品;
  • 抽象产品(AbstractProduct):所有产品的基类,提供产品类的公共方法;
  • 具体产品(ConcreteProduct):具体的产品类。

(3)实例

Factory.h

#ifndef FACTORY_H
#define FACTORY_H
#include <iostream>
#include <string>

/********************************产品类***********************************/
//抽象产品类AbstractProduct(并非真正意义上的抽象类,含有纯虚函数才是抽象类)
class AbstractSportProduct
{
public:
AbstractSportProduct(){}
~AbstractSportProduct(){}

//虚函数
virtual void play(){}
};

//具体产品类Basketball
class Basketball :public AbstractSportProduct
{
public:
Basketball(){}
~Basketball(){}

//具体实现方法
void play();
};

//具体产品类Football
class Football :public AbstractSportProduct
{
public:
Football(){}
~Football(){}

//具体实现方法
void play();
};

/********************************工厂类***********************************/
//抽象工厂类
class AbstractFactory{
public:
//纯虚函数
virtual AbstractSportProduct *getSportProduct() = 0;
};

//具体工厂类BasketballFactory
class BasketballFactory:public AbstractFactory
{
public:
BasketballFactory(){}
~BasketballFactory(){}

AbstractSportProduct *getSportProduct();
};

//具体工厂类FootballFactory
class FootballFactory:public AbstractFactory
{
public:
FootballFactory(){}
~FootballFactory(){}

AbstractSportProduct *getSportProduct();
};

#endif // FACTORY_H

Factory.cpp

#include "Factory.h"

/********************************产品类方法***********************************/
//Basketball方法
void Basketball::play(){
printf("play Basketball\n");
}

//Football方法
void Football::play(){
printf("play Football\n");
}

/********************************工厂类方法***********************************/
//BasketballFactory方法
AbstractSportProduct *BasketballFactory::getSportProduct()
{
return new Basketball();
}

//FootballFactory方法
AbstractSportProduct *FootballFactory::getSportProduct()
{
return new Football();
}

main.cpp

#include "Factory.h"

int _tmain(int argc, _TCHAR* argv[])
{
AbstractSportProduct *pro = nullptr;
AbstractFactory *fac = nullptr;

fac = new BasketballFactory();
pro = fac->getSportProduct();
pro->play();

fac = new FootballFactory();
pro = fac->getSportProduct();
pro->play();

    return 0;
}

输出结果:

(4)总结

如果想增加棒球(Baseball)类,只需要增加一个棒球工厂(BaseballFacory),然后在客户端代码中修改具体工厂类的类名,而原有的类的代码无需修改。由此可看到,相较简单工厂模式,工厂方法模式更加符合开闭原则。工厂方法是使用频率最高的设计模式之一,是很多开源框架和API类库的核心模式。

优点:

  • 工厂方法用于创建客户所需产品,同时向客户隐藏某个具体产品类将被实例化的细节,用户只需关心所需产品对应的工厂;
  • 工厂自主决定创建何种产品,并且创建过程封装在具体工厂对象内部,多态性设计是工厂方法模式的关键;
  • 新加入产品时,无需修改原有代码,增强了系统的可扩展性,符合开闭原则。

缺点:

  • 添加新产品时,需要同时添加新的产品工厂,系统中类的数量成对增加,增加了系统的复杂度,更多的类需要编译和运行,增加了系统的额外开销;
  • 工厂和产品都引入了抽象层,客户端代码中均使用的抽象层,增加了系统的抽象层次和理解难度。

(z)源码路径

gitee: https://gitee.com/CogenCG/DesignMode

(0)

相关推荐

  • 【重温设计模式】之002简单工厂模式

    [重温设计模式系列源码] 简单工厂模式 基本原理 含义 简单工厂模式又叫静态方法模式(因为工厂类定义了一个静态方法). 在现实生活中,工厂是生产产品的, 同样的,在设计模式中,一个负责生产" ...

  • 【重温设计模式】之004抽象工厂模式

    [重温设计模式系列源码] 抽象工厂模式 基本原理 含义 抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口, 而无须指定它们具体的类:具体的工 ...

  • 创建型设计模式总结

    Intro 前面几篇文章已经把创建型设计模式都介绍了,来做一个简单的总结. 创建型设计模式,就是用来创建对象的设计模式,根据要创建的对象的复杂度以及是否允许多实例以及是否需要容易扩展等多方面考虑去选择 ...

  • 【C++设计模式一】C++简单工厂模式

    (1)定义 定义一个简单工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类. (2)结构 简单工厂模式有以下的结构: 工厂(Factory):根据客户提供的具体产品类的参数 ...

  • PHP设计模式之简单工厂模式

    PHP设计模式之简单工厂模式 先从简单工厂入门,不管是面试还是被他人面试,在问到设计模式的时候,大多数人都会提到工厂模式.毫无疑问,工厂相关的几种模式在设计模式中是最出名的也是应用比较广泛的一种模式. ...

  • PHP设计模式之抽象工厂模式

    PHP设计模式之抽象工厂模式 工厂模式系列中的重头戏来了,没错,那正是传闻中的抽象工厂模式.初次听到这个名字的时候你有什么感觉?反正我是感觉这货应该是非常高大上的,毕竟包含着"抽象" ...

  • [PHP小课堂]PHP设计模式之简单工厂模式

    PHP设计模式之工厂方法模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • [PHP小课堂]PHP设计模式之抽象工厂模式

    [PHP小课堂]PHP设计模式之抽象工厂模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 【设计模式】简单工厂模式

    定义 通过工厂类提供的方法,创建不同的派生类 通常创建的类都具有共同的基类/接口 优缺点 优点 客户端与具体的实现类解耦 缺点 新增产品需要修改原来工厂类的方法,不符合开闭原则 角色 客户端 --&g ...

  • 深入学习《大话设计模式》 简单工厂模式

    简单工厂模式 定义:封装改变,既然要封装改变,自然也就要找到需要更改的代码,然后将需要更改的代码用类来封装,这样的思路就是我们简单工厂模式的实现方式了 下面我们通过一则小故事来简述一下我们在项目中为什 ...

  • 设计模式-创建型-工厂模式

    工厂设计模式: 顾名思义,该模式是用来生产对象的.在面向对象的设计模式中,万物皆对象,若使用new来创建对象,就会对该对象产生强耦合,假如我们需要更换该对象,那么使用该对象的对象都需要进行修改,这显然 ...

  • 设计模式(二十二)——状态模式(APP抽奖活动+借贷平台源码剖析)

    24.1 APP 抽奖活动问题 请编写程序完成 APP 抽奖活动 具体要求如下: 1) 假如每参加一次这个活动要扣除用户 50 积分,中奖概率是 10% 2) 奖品数量固定,抽完就不能抽奖 3) 活动 ...

  • 设计模式——把类作为参数的抽象工厂模式

    今天给大家介绍一个非常简单的设计模式,一学就会,非常好用. 这个模式叫做抽象工厂模式,大家可能对工厂模式比较熟悉,在工厂模式当中封装了实例的创建逻辑.主要的用途一般是将一些复杂的类的创建过程整合在一起 ...