C++ 设计模式 之 简单工厂模式和工厂方法模式

简单工厂模式

    简述
        简单工厂模式 又叫 静态工厂方法模式,属于创建型模式。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。
         
    模式结构

        
        工厂: 整个模式的核心,负责实现创建所有实例的内部逻辑。
        抽象产品:所有具体产品的父类,负责描述所有实例所共有的公共接口。
        具体产品:最终创建的具体产品

     优缺点
        优点:
  • 工厂类包含了必要的逻辑判断,根据指定的信息来创建对应的产品。客户端仅负责“消费”产品即可,实现了对象创建和使用的分离。
  • 客户端无需关心具体产品如何创建与组织,仅需知道具体产品所对应的参数即可,可以在一定程度减少使用者的记忆量。

        缺点:

  • 由于工厂类集中了所有产品的创建逻辑(违反了高内聚责任分配原则),职责过重,一旦无法正常工作,整个系统都将受到影响。
  • 一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

        这些缺点在 C++工厂方法模式 中得到了一定的克服。

案例互联网行业有三巨头 BAT,汽车界也有三大豪门 BBA - 奔驰、宝马、奥迪。他们是驰名世界的汽车企业,也被认为是高档汽车生产的先导,最可怕的是均属于德国制造。奔驰优雅稳重、宝马操控感强、奥迪大气,更是官车的代表。。。“坐奔驰,开宝马”,足以说明一切。在国内,BBA 大受欢迎,对很多人来说,不仅是代步工具,更是身份的象征。
      

代码实现

/*头文件*/
#include <iostream>

enum CARTYPE
{
	BEN_CHI = 0,
	BAO_MA = 1,
	AO_DI =2
};

//产品抽象类
class ICar
{
public:
	virtual void carName() = 0;
};

/*源文件*/
#include "SimpleFactory.h"

//具体产品类
class BenzCar : public ICar
{
public:
	virtual void carName() { std::cout << "Benz" << std::endl; }
};

class BaoMCar : public ICar
{
public:
	virtual void carName() { std::cout << "BaoM" << std::endl; }
};


//工厂类
class Factory
{
public:
	ICar* product(CARTYPE car)
	{
		ICar *ica = nullptr;

		switch (car)
		{
			case BEN_CHI:
				ica = new BenzCar();
				break;

			case BAO_MA:
				ica = new BaoMCar();
				break;

			case AO_DI:
				break;

			default:
				break;
		}

		return ica;
	}
};


int main()
{
	Factory *fctr = new Factory();
	ICar *ica = fctr->product(BAO_MA);
	ica->carName();
	delete ica;

	getchar();
	return 0;
}


工厂方法 模式
    简述
            工厂方法模式 是一种常用的对象创建型设计模式,此模式的核心思想是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦,复用以及方便后期维护拓展的目的。

    UML 结构图


        抽象工厂:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口
        具体工厂:实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且被应用程序调用以创建产品对象。
        抽象产品:所创建对象的基类,也就是具体产品的共同父类或共同拥有的接口。
        具体产品:实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应

    优缺点
        

            优点:

  •      克服了简单工厂模式违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性。所以说,“工厂方法模式”是“简单工厂模式”的进一步抽象和推广。

            缺点:

  •      每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。

案例分析

工厂模式基本和简单工厂模式差不多,简单工厂模式 - 在产品子类添加时,需要添加一个判断分支,这违背了开放-封闭原则。因此,工厂模式就是为了解决这个问题而产生的。

/*头文件*/
#include <iostream>

enum CARTYPE
{
	BEN_CHI = 0,
	BAO_MA = 1,
	AO_DI = 2
};

class ICar
{
public :
	virtual void carName() = 0;
};

class Factory
{
public:
	virtual ICar* product(CARTYPE carTyp) = 0;
};

/*源文件*/
#include "FactoryMethod.h"

class Benz : public ICar
{
public:
	virtual void carName() { std::cout << "Benz" << std::endl; }
};
class BaoM : public ICar
{
public:
	virtual void carName() { std::cout << "BaoM" << std::endl; }
};


class BenFacty : public Factory
{
	virtual ICar* product(CARTYPE carType) { return new Benz(); }
};
class BaoFacty : public Factory
{
	virtual ICar* product(CARTYPE carType) { return new BaoM(); }
};


int main()
{
	Factory *ben = new BenFacty();
	ICar *benCar = ben->product(BEN_CHI);
	benCar->carName();
	delete benCar;
	delete ben;

	getchar();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zyx_0604/article/details/80733013